c++ - enable_if函数在不应该定义的时候定义

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

作为实验,我试图使一个无成员函数的void成员函数不会基于类模板参数改变行为:

#include <iostream>
#include <limits>

template<typename T>
class MyClass
{
public:
  void MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy = T());
  void MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy = T());

};

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<T>::value, T> dummy)
{
}

template<typename T>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<T>::value, T> dummy)
{
}

class Simple {};

int main(int argc, char *argv[])
{
  MyClass<int> myClass;
  myClass.MyFunc();

//   MyClass<Simple> myClass2;
//   myClass2.MyFunc();

  return 0;
}

但是,我得到了:错误:重载的“MyFunc()”的调用是模棱两可的。不应该只定义其中一个函数,因为除了!以外,其他所有函数都相同。在其中之一?

最佳答案

不,首先,您需要实际访问::typeenable_if typedef,其次,您的代码将无法使用,因为您的成员不是模板。其中之一总是最终将成为无效的声明。

在应用了必要的::type修复程序之后,实例化MyClass<int>时,您的代码将失败,远远早于您尝试调用该成员的时间。

使您的成员成为成员模板,并使enable_if取决于成员模板的参数,而不取决于封闭类模板的参数。

关于c++ - enable_if函数在不应该定义的时候定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495579/

相关文章:

c++ - 使用 SFINAE 进行模板类特化

c++ - 如何使用 QT 在 Windows 中启动进程?

c++ - 转换 std::vectors 的简单模板函数 - "illegal use of this type as an expression"

c++ - 将静态方法作为参数传递,不需要地址运算符?

c++ - 如何使用 decltype 获取某些类类型的成员函数的地址?

c++ - 多次询问用户输入

c++11 - gcc:切换后如何最好地处理有关(无法到达的)功能结束的警告?

C++ 模板特化 - 避免重新定义

c++ - enable_if 未排除模棱两可的模板参数

c++ - 如何使用 MFC 获取单独窗口的句柄?