作为实验,我试图使一个无成员函数的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()”的调用是模棱两可的。不应该只定义其中一个函数,因为除了!以外,其他所有函数都相同。在其中之一?
最佳答案
不,首先,您需要实际访问::type
的enable_if
typedef,其次,您的代码将无法使用,因为您的成员不是模板。其中之一总是最终将成为无效的声明。
在应用了必要的::type
修复程序之后,实例化MyClass<int>
时,您的代码将失败,远远早于您尝试调用该成员的时间。
使您的成员成为成员模板,并使enable_if
取决于成员模板的参数,而不取决于封闭类模板的参数。
关于c++ - enable_if函数在不应该定义的时候定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60495579/