2012-03-30 15 views
2

を取るために、それは追加のテンプレートパラメータを取るために、テンプレートクラスを特化することは可能ですか?例えばCは、追加のテンプレートパラメータ

template <typename T> 
struct X { 
    void foo() { cerr << "Generic" << endl;} 
}; 


template <> 
template <bool b> 
struct X<int> { 
    void foo() { cerr << "Specialization" << endl;} 
}; 

Iは、G ++で上記の作業を行うことができませんでしたが、多分、この作業を行いますいくつかのトリックがあります。

編集:私は私が持っている場合は、それが唯一X<int>. の機能ですので、私は、ユーザーが任意の値を指定する必要はありませんできるようにすることができます方法はあり、基本テンプレートXにテンプレート<bool b>を移動する必要はありませんそれのための?私は本当に アプローチのように、このルートを下がらないだろうと。

+0

を使用すると、テンプレートの部分特殊化のことを聞いたことがありますか? –

+2

「私がしている場合は*、私は、ユーザーがそれのために任意の値を指定する必要はありませんできるようにすることができます方法はあり*?」はい - デフォルトのテンプレートパラメータ。例えば。 'template 'となります。 – ildjarn

+1

@ildjarnは言っていますが、ほとんどの場合、bool以外のいくつかのタイプを使用する方が良いことに注意してください。 'mytempl ' myempl '' '対mytempl '対mytempl ''よりも通常より有意義です。 –

答えて

2

あなたが代わりにプロキシ特性クラスを受け入れるためにプライマリテンプレートを変更することができます:

template <typename T> 
struct Foo 
{ 
    typedef typename T::type type; 

    // work with "type" 

    void static print() { std::cout << T::message << std::endl; } 
} 

次に形質クラスを定義します。

template <typename T> 
struct traits 
{ 
    typedef T type; 
    static const char * const message = "Generic"; 
}; 

今、あなたはFoo<traits<double>>Foo<traits<int>>をインスタンス化することができ、あなたがカプセル化することができますあなたは必要に応じて特化することができるtraitsクラスに追加の動作。

template <> 
struct traits<int> 
{ 
    typedef int type; 
    static const char * const message = "Specialized"; 
}; 
+0

そのためにプライマリテンプレートを変更する必要はありません。ただ、 '特性を​​'受け入れる専門を作ります。 –

関連する問題