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

なぜ count クラス テンプレートを部分的に特殊化する必要があるのか​​疑問に思っていました。

次のようなことができますか?

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

しかし、これは機能しませんが、なぜですか?

どんな助けでも大歓迎です:)

編集:回答に従ってソリューションを編集しました。

4

2 に答える 2

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

の専門ではない

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

つまり、dd常に少なくとも 1 つのパラメーターが必要です。


補足として、可変個引数テンプレート パラメーターの数を取得する組み込みの方法が既にあり、count構造体は次のように実装できます。

template <class ...args>
struct count
{
    static const int value = sizeof...(args);
};
于 2011-10-09T12:17:55.540 に答える
2

template <typename T, typename... Args>省略した特殊化T(つまりdd<>) を作成することはできません — パックを空にすることはできますが、空にするTことはできません。したがって、テンプレートをパックのみを取るものとして宣言し、再帰を停止するために空のパックに特化し、<T, Args...>1 つの型をアンパックして (n - 1) 型の新しいパックを作成するために部分的に特化します。

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

于 2011-10-09T12:17:06.537 に答える