2016-04-09 18 views
0

Während versucht, das Konzept der variadischen Vorlagen zu verstehen. Ich bin auf dieses Beispiel gestoßen. Dies scheint für mich ein minimalistisches Beispiel zu sein.kann nicht verstehen, diese variadic Vorlage Beispiel

void output() --------->function A 
{ cout << "This is the results\n"; } 

template <typename T, typename ...P> 
void output(T t, P ...p) ------->functionB 
{ 
    cout << t << ' '; 
{ 
    output(p...); ------>statement A 
} 

} 


//Test it 
int main() 
{ 
    output('5', 2); 

    return(0); 
} 

Nun ist die Ausgabe des obigen Programms ist:

5 2 This is the results 

Hier sind einige Fragen, die ich in Bezug auf dieses Beispiel hatte:

1) Was Aussage ist eine Berufung? ruft es die Funktion A? Aber es scheint nur einmal zu nennen, und auch die Methode hat keine Parameter in ihrer Signatur? Wie habe ich 5 2 This is the results in dem obigen Beispiel als Ausgangs

2) erhalten Was bedeutet es, wenn der Autor erklärt, dass variadische Klassen rekursiv sind und somit benötigen sie eine Basisklasse

+2

Sie haben nicht sorgfältig gelesen. Es ist "Base Case", nicht "Basisklasse". –

+2

Ich denke, das sollte in jedem Tutorial zu variadischen Vorlagen behandelt werden, nein? – juanchopanza

Antwort

1

Lassen Sie uns Ihr Beispiel ändern:

int g = 0; 

void output() { cout << "This is the results\n"; } 

template <typename T, typename ...P> 
void output(T t, P ...p) 
{ 
    cout << "\n\tg = " << g++ << endl; 
    cout << t << ' '; 
    { 
    output(p...); 
    } 
} 

Der Ausgang wird sein:

g = 0 
5 
g = 1 
2 This is the results 

Also, wenn Sie die Ausgabe aufrufen ('5', 2); die Compiler Code generiert, was folgende tun:

void output(char c, int x) 
{ 
    cout << c << ' '; 
    output(x); 
} 

Dann wird es „rekursiv“ erzeugen, um die Funktion:

void output(int x) { 
    cout << x << ' '; 
    output(); 
} 

Für den Basisfall bereits definierten „Leerer Ausgang()“:

void output() { cout << "This is the results\n"; } 

also ein Compiler wird es verwenden, anstatt einen Code aus der Vorlage zu generieren.

+0

Danke für die Erklärung. Das hat es aufgeräumt –

1

1) Was ist Statement A Calling? ruft es die Funktion A? Aber es scheint es nur einmal aufzurufen? Auch die Methode hat keine Parameter in seiner Signatur?Wie habe ich 5 2 bekommen Dies ist die Ergebnisse in dem obigen Beispiel als Ausgangs

Wenn Sie die Funktion wie folgt aufrufen:

output('5', 2); 

t == '5' und ...p wird der Rest der Argumente sein die 2 nur

void output(T t, P ...p) 
//   '5' { 2 } 

Sie drucken dann den ersten Typ char:

cout << t << ' '; 
//  '5' 

Und dann die Funktion erneut aufrufen (Rekursion) mit dem Rest der Argumente:

output(p...); // p is only {2} 

Sie wieder drucken nur die Nummer 2:

cout << t << ' '; 
//  2 

Und Es sind keine Argumente mehr vorhanden und der Basisfall wird aufgerufen:

void output() 
+0

Danke für die tolle Antwort. Während deine Antwort informativer war. Ich würde Vadims Antwort wie zuvor gepostet haben. Er gab mir einen Hinweis, wie ich es herausfinden sollte, und ich musste zum Zeichenbrett gehen, um es herauszufinden und zu experimentieren. Das Lesen Ihrer Antwort bestätigt meine Ergebnisse und es war viel einfacher zu verstehen. Ich weiß es wirklich zu schätzen, dass Sie dabei sind und eine großartige und kurze Erklärung abgeben. –

Verwandte Themen