decltype
SFINAEでの使用は簡単enable_if
ではないようです。私は3つの異なる方法でgo
使用法を書いてみました。enable_if
それらはすべてコンパイラエラーで失敗しました(GCCでは文字通り「エラー:'thing'は'foo'のメンバーではありません」とインスタンス化コンテキストです)。
#include <type_traits>
struct foo {
enum { has_thing = false };
};
struct bar {
enum { has_thing = true };
static int thing() { return 0; }
};
template <typename T>
struct Test {
/*auto go(typename std::enable_if<T::has_thing, int>::type=0)
-> decltype(T::thing()) {
return T::thing();
}*/
/*typename std::enable_if<T::has_thing, decltype(T::thing())>::type go() {
return T::thing();
}*/
template <bool B=T::has_thing, typename std::enable_if<B, int>::type = 0>
auto go() -> decltype(T::thing()) {
return T::thing();
}
};
int main() {
Test<bar> b;
Test<foo> f;
}
私は問題が何であるかを見ることができます-関数を除外する機会をdecltype
得る前に起こる必要があります。enable_if
残っている問題は、どのように回避して同様の動作を得るかです。has_thing
で使用するトレイトを書くことに頼らずにこれを行うための簡単で一般的な方法は ありenable_if
ますか?
G++4.7とclang++3.0の両方でテストされています。