以前に同様の質問をしたことがありますが、部分的に専門化することで機能させることができることを理解しました。しかし、可変個引数テンプレートの基本を理解するために、このようなコードを変更しました。
template<typename T, typename... args>
struct counter{
static const int value= 1+ counter<args...>::value;
};
template<typename T>
struct counter<T>{
static const int value = 0;
};
エラー: 「申し訳ありませんが、実装されていません: 'args ...' を固定長の引数リストに展開することはできません」
これはバグであり、gcc 4.7.0 で修正されていることを理解しています
したがって、これをすべて修正するには、テンプレートを部分的に特殊化するトリックまたはその他を使用する必要があります。
template<typename... Args> struct counter;
template<>
struct counter<> {
static const int value = 0;
};
template<typename T, typename... Args>
struct counter<T, Args...> {
static const int value = 1 + counter<Args...>::value;
};
実際の質問:コードが機能するように部分的な特殊化がここで行う特殊効果を本当に知りたいですか、それとも部分的な特殊化が問題をどのように解決するかを尋ねる必要がありますか? (2 番目のバージョンでバグがヒットしないのはなぜですか?)。動機付けの問題と例を含む説明は非常に役立ちます.