decltype
の結果をC++ 11で比較する方法はありますか?decltypeの比較
は、なぜこのコードは無効です:
template<typename T, typename U>
void func(T& t, U& u) {
if(decltype(t) == decltype(u)) {
// Some optimised version for this case
} else {
// A more general case for differing types
}
}
私はいくつかのケースでは、この特定の問題は、テンプレートの部分特殊化によって解決することができることを知っています。私の質問はdecltype
の比較です。
編集: SFINAEを介してフリー機能のデフォルトを提供しようとする過程で質問が出てきました。これが無効である理由を、より良い質問がされているだろうおそらく:
template<bool B>
bool SomeFunction() { ... }
template<typename T, typename U>
bool SomeFunctionWrapper(T& t, U& u) {
SomeFunction<decltype(t) == decltype(u)>();
}
私は以来、別の解決策を見つけた(つまり、すべてのテンプレートを含まない)が、1つの段階で、私はこの試みた:
// If it exists, the free function is defined as
// bool AFreeFunction();
typedef struct { char } undefined;
template<typename T = void>
undefined AFreeFunction();
template<bool B>
bool AFreeFunctionWrapper_() {
return false;
}
template<>
bool AFreeFunctionWrapper_<false>() {
return AFreeFunction();
}
bool AFreeFunctionWrapper() {
return AFreeFunctionWrapper_<decltype(AFreeFunction()) == decltype(undefined)>();
}
を
私は最終的にGCC 4.6で動作するこの戦略の変種を得ましたが、2012 RCであっても、デフォルトのテンプレート引数はMSVCのテンプレート関数には使用できません。したがって、最終的な解は次のようになります。
class AFreeFunction {
public:
operator bool() { return false; }
};
関数が定義されていれば、呼び出されます。そうでない場合は、そのクラスのコンストラクタとして解釈され、暗黙的にbool
にキャストされます。
上記のフリー関数形式は、部分的な特殊化では解決できないことに注意してください。それを可能にするためにクラステンプレートとして再定式化する必要があります。 – Tom
いいえ、クラステンプレートである必要はありません。*オーバーロードされた*関数テンプレートの単純なセットにすることができます。 –
@ n.m。いい視点ね。 – Tom