不应该定义的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()”的调用不明确。不应该只定义这些函数中的一个或另一个,因为除了 ! 之外,一切都是相同的。在其中之一?
As an experiment, I am trying to make a void member function with no parameters change behavior based on the class template parameter:
#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;
}
However, I am getting: error: call of overloaded ‘MyFunc()’ is ambiguous. Shouldn't only one or the other of those functions get defined, since everything is the same except for a ! in one of them?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不,首先您需要实际访问
enable_if
的::type
typedef,其次,您的代码将无法工作,因为您的成员不是模板。其中之一最终总是会成为无效声明。应用必要的
::type
修复后,在您尝试调用成员之前,实例化MyClass
时,您的代码将会失败。使您的成员成为成员模板,并使
enable_if
依赖于成员模板的参数,而不是依赖于封闭类模板的参数。No, first you need to actually access the
::type
typedef ofenable_if
, and second, your code will not work because your members are not templates. One of them always will end up being an invalid declaration.After applying the necessary
::type
fix, your code will fail when instantiatingMyClass<int>
, long before you try to call the member.Make your members member templates, and make the
enable_if
depend on a parameter of the member template, instead of on a parameter of the enclosing class template.您必须制作虚拟模板参数才能完成我的要求:
You have to make dummy template parameters to do what I was asking:
说:
Say: