decltype
とSFINAE enable_if
を使用するのは簡単ではないようです。私はgo
をenable_if
で3種類の方法で書こうとしました。それらのすべてがコンパイラエラーで失敗しました(GCCの文字通り「エラー: '事は' fooのメンバーではありません」とインスタンス化コンテキスト)。 enable_if
も機能を排除する機会を得る前に発生する必要がdecltype
-declitypeとenable_ifを混ぜる
#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;
}
私は問題が何であるかを見ることができます。残っている問題は、回避して同様の動作を得る方法です。 enable_if
で使用する特性をhas_thing
と書くことにせずにこれを行う簡単で一般的な方法はありますか?
G ++ 4.7とclang ++ 3.0の両方でテストされています。
コンパイルエラーを投稿できますか?また、コンパイラのバージョンが役に立ちます。私は経験からコンパイラがこの部門ではまだ非常にバグだと言うことができます。 –