2012-04-23 24 views
7

テンプレートパラメータを関数パラメータとして使用せずにvariadicテンプレートを使用できますか?関数パラメータを持たないVariadicテンプレート

私はそれらを使用すると、それはコンパイル:

#include <iostream> 
using namespace std; 

template<class First> 
void print(First first) 
{ 
    cout << 1 << endl; 
} 

template<class First, class ... Rest> 
void print(First first, Rest ...rest) 
{ 
    cout << 1 << endl; 
    print<Rest...>(rest...); 
} 

int main() 
{ 
    print<int,int,int>(1,2,3); 
} 

をしかし、私はそれらを使用していないとき、それはコンパイルと曖昧に不満はありません:

#include <iostream> 
using namespace std; 

template<class First> 
void print() 
{ 
    cout << 1 << endl; 
} 

template<class First, class ... Rest> 
void print() 
{ 
    cout << 1 << endl; 
    print<Rest...>(); 
} 

int main() 
{ 
    print<int,int,int>(); 
} 

残念ながらクラスIテンプレートパラメータはインスタンス化できません(テンプレート関数の内部で呼び出される静的関数があります)。 これを行う方法はありますか?

+1

'のstd :: declval ()'。任意の 'T 'のために動作します。 –

+4

なぜ引数なしのバージョンが機能しないのか:引数がなければ 'print 'と 'print 'の両方が同じように良いですが、 'print (3)'の引数は 'print (3、{}) '(' {} 'は"何も意味しません ")。 CatPusPusが示唆するように、オーバーロードを使用しない方法が標準的な方法です。とにかくあなたの議論を推論していないので、最も簡単な解決策です。 –

+0

私は答えを投稿するつもりでしたが、n.m.すでにそれを投稿しました。 – bames53

答えて

20
template<class First> // 1 template parameter 
void print() 
{ 
    cout << 1 << endl; 
} 

#if 0 
template<class First, class ... Rest> // >=1 template parameters -- ambiguity! 
void print() 
{ 
    cout << 1 << endl; 
    print<Rest...>(); 
} 
#endif 

template<class First, class Second, class ... Rest> // >=2 template parameters 
void print() 
{ 
    cout << 1 << endl; 
    print<Second, Rest...>(); 
} 
+1

'cout'行を繰り返すのではなく、最も下のバージョンから' print () 'を呼び出すことで、コードの重複を取り除くことができます。おもう。 –

8

タイプにします。あなたが特定のタイプの*未評価*表現が必要な場合は、使用することができます

template <typename... Ts> 
struct print_impl; 

template <typename T> 
struct print_impl<T> { 
    static void run() { 
     std::cout << 1 << "\n"; 
    } 
}; 

template <typename T, typename... Ts> 
struct print_impl<T, Ts...> { 
    static void run() { 
     std::cout << 1 << "\n"; 
     print_impl<Ts...>::run(); 
    } 
}; 

template <typename... Ts> 
void print() { 
    print_impl<Ts...>::run(); 
} 

int main() { 
    print<int, int, int>(); 
    return 0; 
} 
+0

私はここの複雑さは合理的ではないと思います。 n.m.のソリューションはずっと簡単です。 – bames53

関連する問題