enum class enabler{};
template<typename T>
class X {
template<typename std::enable_if<std::is_class<T>::value,enabler>::type = enabler()>
void func();
void func(int a);
void func(std::string b);
};
我有这个类,其中有 func
的这 3 个重载。我需要第二/第三版本可用于类/非类类型,并且第一个版本仅可用于类类型。当我尝试如上所述使用 enable_if
时,非类类型的类实例化会出现编译错误。
最佳答案
对于SFINAE为了工作,必须推导模板参数。在您的情况下,当您尝试实例化 func
时,T
已经已知,因此如果 enable_if
条件为 false
,而不是 SFINAE,您会得到一个硬错误。
要修复该错误,只需添加一个默认值为 T
的模板参数,并在 enable_if
检查中使用这个新参数。现在发生演绎,并且 SFINAE 可以针对非类类型启动。
template<typename U = T,
typename std::enable_if<std::is_class<U>::value,enabler>::type = enabler()>
void func();
而且您实际上也不需要专用的enabler
类型,这也有效
template<typename U = T,
typename std::enable_if<std::is_class<U>::value, int>::type* = nullptr>
void func();
关于c++ - 如何使用带有重载的enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38908260/