作为一个实验,我试图根据类模板参数创建一个没有参数更改行为的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()'的调用是不明确的。不应只定义这些函数中的一个或另一个,因为除了a之外的所有内容都是相同的!其中一个?
答案 0 :(得分:4)
不,首先您需要实际访问::type
的{{1}} typedef,其次,您的代码将无效,因为您的成员不是模板。其中一个总是最终成为无效的声明。
应用必要的enable_if
修补程序后,在尝试调用该成员之前,您的代码将在实例化::type
时失败。
使您的成员成员模板,并使MyClass<int>
依赖于成员模板的参数,而不是依赖于封闭类模板的参数。
答案 1 :(得分:2)
您必须制作虚拟模板参数才能完成我的要求:
#include <iostream>
#include <limits>
template<typename T>
class MyClass
{
public:
template <typename U = T>
void MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy = U());
template <typename U = T>
void MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy = U());
};
template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<std::is_fundamental<U>::value, U>::type dummy)
{
}
template<typename T>
template<typename U>
void MyClass<T>::MyFunc(const typename std::enable_if<!std::is_fundamental<U>::value, U>::type dummy)
{
}
class Simple {};
int main(int argc, char *argv[])
{
MyClass<int> myClass;
myClass.MyFunc();
MyClass<Simple> myClass2;
myClass2.MyFunc();
return 0;
}
答案 2 :(得分:0)
说:
std::enable_if<std::is_fundamental<T>::value, T>::type
// ^^^^^^