2

さまざまな場所でさまざまなタイプにテンプレート化されることを期待しているテンプレート関数があります。
問題は、コンパイル時に、特定のタイプが2つの異なる方法で別のテンプレートを生成するための特殊化があるかどうかを知りたいということです。

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

ここのように関数の存在をテストできることは知っています。

toboolが専門化されているかどうかをテストする方法についてのチャンスはありますか?

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

4

2 に答える 2

3

(やや醜くて壊れやすい)回避策として、関数ではなく構造体の特殊化を要求し、構造体が特殊化されているかどうかを示すクラス定数を含めることができます。

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

もう1つのオプションはtobool、専門分野でのみ定義することです。そうすれば、特殊化されていないクラスToBool<Foo>::tobool(f)用にコンパイルされません。FooToBool

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

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

型にbool変換がない場合(数値型またはポインター型への変換。どちらもboolへの標準変換があります)、プログラムはコンパイルされません。出来上がり、コンパイル時の変換チェック。

ブール値への暗黙の変換が必要ない場合は、演算子を定義できます。明示的な変換にはダブルバンを使用します(ただし、これは読みやすくありません)。

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

...
    Foo f;
    if (!!f) ...
于 2010-11-29T04:27:18.743 に答える
0

特定の質問に対する答えは次のとおりです。いいえ、T がプライマリ テンプレートと専用テンプレートのどちらを使用しているかを確認することはできません。@Martin Yorkの質問は非常に良いものです.なぜあなたはそれをチェックしたいのですか? :)

于 2010-11-28T20:37:23.637 に答える