2010-11-28 11 views
2

私は、異なる場所で異なるタイプのテンプレート化が期待されるテンプレート関数を持っています。
問題は、指定された型が2つの異なる方法で別のテンプレートを生成するために特殊化されているかどうかをコンパイル時に知りたいということです。C++テンプレートは、特定の型に対して関数が多重定義されているかどうかを確認できますか?

template<typename T> 
bool tobool(const T&){ throw Exception("Can't cast to bool");}; 
template<> bool tobool<bool>(const bool &value){ return value;} 

私はあなたがhereのように機能existanceのためにテストすることができます知っています。

toboolが特化されているかどうかをテストする方法はありますか?

tobool()が特殊化されている場合はtrueを返し、そうでない場合はfalseを返すisbool()を生成するとします。

+1

正しく理解できますか? :Tタイプごとに、TブールがTに特化しているかどうかを示すメタ機能が必要ですか? –

+0

そうですね、私はTがジェネリックまたは特殊なトールを使用しているかどうかを知る必要があります。 –

+3

コンパイル時に、その存在をチェックして、結果と何をすることができますか? –

答えて

3

、あなたは構造体の専門ではなく、機能を必要とし、構造体が特化されているかどうかを示すために一定のクラスを含めることができます

template <typename T> 
struct ToBool { 
    static bool tobool(const T&); 
    static const bool specialized = false; 
}; 

別のオプション特殊化されている場合にのみtoboolを定義することです。そうすれば、ToBool<Foo>::tobool(f)は、が特化されていないクラスFooにはコンパイルされません。

toboolの代わりに、変換するクラスを制御できる場合は明示的な変換演算子を使用できます。型はBOOL変換を持たない場合

class Foo { 
public: 
    operator bool(); 
    ... 
}; 
... 
    Foo f; 
    if (f) ... 

(ウェル、BOOLする規格変換を持っている両方とも数値またはポインタ型への変換)は、プログラムがコンパイルされません。 Voila、変換のためのコンパイル時間チェック。

boolへの暗黙的な変換を望まない場合は、演算子を定義できます。明示的な変換にはdouble-bangを使用してください(これは判読できません)。

class Foo { 
public: 
    bool operator!(); 
    ... 
}; 

... 
    Foo f; 
    if (!!f) ... 
0

あなたの特定の質問に対する答えは次のとおりです。いいえ、Tがプライマリまたは特殊テンプレートを使用しているかどうかを確認することはできません。 @マーティンヨークの質問は非常に良いものです:なぜあなたはそれを確認したいですか? :)(やや醜いと脆い)回避策として

+0

tobool が特殊化されている場合はtrueを返し、そうでない場合はfalseを返すisbool()メソッドを持つクラステンプレートが存在するためです。 –

関連する問題