似乎decltype
与 SFINAE 一起使用enable_if
并不简单。我尝试以三种不同的方式编写go
using 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 测试。