c++ - 如何使用带有重载的enable_if

标签 c++ templates c++11 sfinae enable-if

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/

相关文章:

C++ std lib <mutex>, <conditional_variable> 库和共享内存

c++ - 捕获 EXCEPTION_GUARD_PAGE 是否安全

c++ - 如何处理错误的数据类型输入

templates - for 循环中的 Saltstack 负载支柱

c++ - 将 lambda 传递给成员变量的构造函数

c++ - 重新绑定(bind) std::function 的一个参数

c++ - 在 Visual Studio 2015 中自动在分号前添加空格

c++ - 需要 C++ 中非常通用的 argmax 函数

c++ - 依赖于模板参数的成员函数实现

c++ - 实现隐式转换为 char* 的 String 类 (C++)