2012-02-18 7 views
3

それ自体がテンプレートであるテンプレートパラメータのすべてのケースをキャッチするテンプレートテンプレートを使用できますか?C++でのテンプレートテンプレートのバリデーション

テンプレートベースのメソッドでは、テンプレートを使用してデバッグ出力を生成しています。まず、私は、ネイティブなタイプのためにそれを専門に、その後、一般的なハンドラを作成しました:

template<typename... PARAMS> struct TypeList{}; 

template<typename TYPE> inline void ntype(ostream &out, TypeList<TYPE>) { 
    out << typeid(TYPE).name(); 
} 

template<> inline void ntype(ostream &out, TypeList<int>) { 
    out << "int"; 
} 

... 

は、それから私は、渡されたテンプレートの種類をキャッチするために、第2のテンプレート形式を追加しようとしました:

サブタイプがテンプレートである
template<typename ... SUB, template<typename...> class TYPE> void ntype(ostream &out, TypeList<TYPE<SUB...> >) { 
    ntype(out, TypeList<typename TYPE>()); 
    out << '<'; 
    subtype(out, TypeList<SUB...>()); 
    out << '>'; 
} 

メソッドをntype()に順番に適用し、paramリストを再帰的に処理するように設計されています。コンパイルエラーが、それはテンプレートテンプレートのバージョンと一致することはありません - それは唯一のこれまでの一般的な最初のテンプレート関数に一致する

ntype<SomeClass<int> >(out, TypeList<SomeClass<int> >()); 

:私はの効果に何かでこれを呼び出すしようとすると

問題があります。私は確かに自分の理解が不足していると確信していますが、Googleの結果はテンプレートテンプレートの例を明確にするためには非常に薄いと思われます。

誰でも私が試みていることが可能であるかどうかを説明することができますか、もしそうなら、私は間違っていますか?

+0

うわー!それは見出しとコードを数えない、 "テンプレート"という言葉の14のインスタンスです! –

+1

私の脳は爆発しました。私はあなたを責めます。 –

+0

テストするのに私が使っているコードがあるはずです:-P – jka6510

答えて

1

私はタイプミスを起こしていたようです。私は、おそらく、ミスマッチの原因となっていた3amの関数呼び出しからのコピーと貼り付けから、関数宣言でTypeListの1つの後に()を追加しました。

誰かが不思議に思っている場合は、はい、それは可能です、そして、上記は完全に受け入れられる方法です。

+0

あまりにも悪いですが、私はこのことからテンプレートについてもっと学ぶと思っていました。 – svick