2016-04-09 11 views
0

variadicテンプレートの概念を理解しようとしていますが、私はこの例に遭遇しました。これは私のための最小限の例のようです。このvariadicテンプレートの例を理解してください

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); 
} 

さて、上記のプログラムの出力は次のとおりです。ここで

5 2 This is the results 

がある私は、この例に関していたいくつかの質問:

1)文は、呼び出し元は何ですか?それは関数Aを呼びますか?しかし、それは一度それを呼び出すように見えますか?また、メソッドはその署名にパラメータを持たないのですか?どのように私は、出力

2として、上記の例では5 2 This is the resultsを手に入れた)著者は述べているとき、それは可変引数のクラスは、再帰的であり、したがって、彼らは基本クラスを必要とすることにどういう意味

+2

あなたは慎重に読んでいません。基本クラスではなく、基本クラスです。 –

+2

これはvariadicテンプレートに関するチュートリアルではカバーされるべきだと思いますか? – juanchopanza

答えて

1

のはにあなたの例を変更してみましょう:

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...); 
    } 
} 

出力は次のようになります。あなたは出力を呼び出すので

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

( '5'、2); コンパイラは、次の操作を行いますどのようなコードを生成します:あなたはすでに定義した基本ケース「のボイド出力()」については

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

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

が、それは「再帰的」機能を生成します。

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

したがって、コンパイラは、テンプレートからコードを生成する代わりに、コンパイラがそれを使用します。

+0

説明をありがとう。これで解決されました –

1

1)ステートメントAコールとは何ですか?それは関数Aを呼びますか?しかし、それは しか一度それを呼び出すようですか?また、メソッドには、 パラメータがその署名にありません?

output('5', 2); 

t == '5'...pた残りの引数になります:どのように私は5 2を手に入れたあなたは、このような機能は、出力

を呼び出すと、これは 上記の例での結果であります

0:あなたは、最初のタイプ charを印刷しているだけ 2

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

です

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

そして、あなたは残りの引数で(再帰)再び関数を呼び出しています

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

もう一度あなただけの数2プリントアウト:

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

をと引数が残っておらず、基本ケースを呼び出す:

void output() 
+0

偉大な答えをありがとう。あなたの答えはより有益でした。以前に投稿されたので、私はVadimsの答えに印を付ける必要がありました。彼は私にそれを理解する方法の手がかりを与え、私はそれを理解し、実験を行うために描画ボードに行っていた。あなたの答えを読むことは私の発見を確認し、それは理解しやすい方法でした。私は本当にあなたに歓声を上げ、偉大な簡単な説明を投稿していただきありがとうございます。 –

関連する問題