2011-10-09 20 views
3

をテンプレートが正常に動作コードです:私たちは、カウントクラステンプレートを専門に部分的に必要とする理由可変個引数は、ここで謎

template<typename... Args> struct count; 

template<> 
struct count<> { 
static const int value = 0; 
}; 

template<typename T, typename... Args> 
struct count<T, Args...> { 
static const int value = 1 + count<Args...>::value; 
}; 

今私は思っていましたか?

は、我々のような何かを行うことができます:

template< typename... args> struct dd; // edited according to answer but now getting error redeclared with 2 template parameters which is point below with mark %% 

template<> 
struct dd<>{ 
static const int value = 0; 
}; 

template<typename T, typename... args> //%% 
struct dd{ 
static const int value= 1+ dd<args...>::value; 
}; 

をしかし、これは動作しますが、なぜしないのですか?

すべてのヘルプは非常に高く評価され:)

編集は:答えに応じたソリューションを編集しました。

+1

注意として実装することができを取得するための組み込みの方法がありますカウントを取得する。 –

答えて

2
あなたが Tを省略専門(すなわち dd<>)を作成することはできません template <typename T, typename... Args>

- パックが空になることができますが、Tはできません。したがって、パックを1つだけ取り出し、空のパックを再帰を停止するように特化してテンプレートを宣言し、1つのタイプを解凍して(n - 1)タイプの新しいパックを作成するために部分的に<T, Args...>に特化します。

編集に関しては、異なる引数で同じ名前の別のテンプレートを定義することはできません。既存のものを特殊化する必要があります。

5
template<> 
struct dd<> { 
static const int value = 0; 
}; 

ddは、常に少なくとも1つのパラメータを必要としますと言い

template< typename T,typename... args> struct dd; 

の専門ではありません。


追記は、既に `可変長テンプレートパラメータの数とcount構造体は、あなたが`はsizeof(引数)を行うことができ

template <class ...args> 
struct count 
{ 
    static const int value = sizeof...(args); 
}; 
+0

それで 'template struct dd;'のようなものを2番目のコードのプライマリテンプレートとして実行すればいいでしょうか?私はまだあなたの答えを理解することができません、それを再編集してください?ありがとう –

+0

@ Mr.Anubisはい、それは動作します(あなたの最初のスニペットと同じです)。 – UncleBens

関連する問題