我想基于带有g ++的枚举使用SFINAE。
使用g ++(4.8.1)进行编译时遇到错误:
error: no type named ‘type’ in ‘struct std::enable_if<false, void>’
clang(3.2)编译它没有那个错误。
(a2和b2在两种情况下都会导致编译错误!)
修改
作为sharth answered,代码是bug,而clang 3.2只是“很好”。
有没有不同的方法来实现这个功能?
#include <type_traits>
enum Foo {
A = 3,
B = 4
};
template<Foo T> class Bar {
const Foo foo_;
public:
Bar() : foo_(T) {}
template<typename = typename std::enable_if<T == A>::type>
Bar(int x, int y, int z) : foo_(T) {}
template<typename = typename std::enable_if<T == B>::type>
Bar(int x, int y, int z, int w) : foo_(T) {}
~Bar() {}
};
int main(int argc, char const *argv[])
{
Bar<A> a1(1,2,3);
Bar<A> a2(1,2,3,4);
Bar<B> b1(1,2,3,4);
Bar<B> b2(1,2,3);
return 0;
}
答案 0 :(得分:7)
您编写模板声明的方式不允许替换失败。您可以使用这样的默认虚拟模板参数来修复它:
template<Foo U = T, typename = typename std::enable_if<U == A>::type>
Bar(int x, int y, int z) : foo_(T) {}
template<Foo U = T, typename = typename std::enable_if<U == B>::type>
Bar(int x, int y, int z, int w) : foo_(T) {}
你会得到预期的行为。 Here is a demo.