2015-10-25 16 views
5

単純な可変テンプレート関数を書きましたが、なぜ機能しないのか理解しようとしています。 (その出力の対応は完璧に動作します。)参照渡しのパラメーターパック

#include <iostream> 

void read() {} 

template<class curr_t, class... rest_t> 
void read(curr_t &var, rest_t... rest) 
{ 
    std::cin >> var; 
    read(rest...); 
} 

int main() 
{ 
    int a = 0, b = 0, c = 0; 

    read(a, b, c); //input: 1 2 3 
    std::cout << a << b << c; //output: 1 0 0 

    std::cin.ignore(); 
    std::cin.get(); 
}  
a b cのコメントからわかるように

、I入力1 2 3と私が手出力が1 0 0です。明らかなように、aだけがその値を保存します。なぜこのようなことが起こったのか、それを解決するために何ができるのでしょうか?ありがとう!

EDIT :: はい、明らかにパラメータパックのコンセプトが間違っていました。 私はまた、次のことをやろうとしていました:rest_t... &restこれは私にコンパイラエラーを与えます。

代わりにrest_t&... restと書くと、意図したとおりに動作します。私はそれが私の側で構文エラーであったと思います!誰かがこれを答えとして投稿し、1分後に彼の答えを削除してくれてありがとう! D:

+4

多分、 'rest'が値渡しと関係しているのでしょうか? – LogicStuff

+0

関数 'read'が無限に繰り返されるとは思いませんか? – vishal

+0

しかし、私が理解するように、パラメータパック "unpacks"として、パックの最初の要素(この場合)はcurr_t&varになります。 – DeiDei

答えて

5

aは参照によって渡されますが、再帰的に呼び出すと、参照によって取得されますが、以前に値によって渡された変数を参照するため、外部的に変更されません。

template<class curr_t, class... rest_t> 
void read(curr_t &var, rest_t&... rest) 
//       ^    
{ 
    std::cin >> var; 
    read(rest...); 
}