已阅读 cppreference std::enable_if
上的文档,我知道我可以做这样的事情:
// foo2 overload is enabled via a parameter
template<class T>
T foo2(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
return t;
}
但是如果被测试的模板参数来自类的模板,而不是方法的模板呢?
在下面的示例中,如果派生类的某些模板参数是浮点类型,我将尝试重载基类方法:
class Base
{
public:
template <typename X>
void fun() {}
};
template <typename T>
class Derived : public Base
{
public:
template <typename X, typename std::enable_if<std::is_floating_point<T>::value, void>::type* = nullptr>
void fun() {}
};
int main()
{
Derived<double> d1;
Derived<int> d2;
return 0;
}
我如何使它起作用?目前,我得到:
error: no type named ‘type’ in ‘struct std::enable_if’
最佳答案
您可能希望为此使用部分特化。在模板成员函数本身上使用 enable_if
(这是可以做到的,只需添加另一个默认值为 T
的模板参数并在上使用 enable_if
该参数)will still hide the base class function .
class Base
{
public:
template <typename X>
void fun() { std::cout << "Base fun()" << std::endl; }
};
template <typename T, bool is_float = std::is_floating_point<T>::value>
class Derived : public Base
{
public:
template <typename X>
void fun() { std::cout << "Derived fun()" << std::endl;}
};
template <typename T>
class Derived<T, false> : public Base
{
};
Demo .
关于c++ - 如何仅在类的模板参数通过某些测试时才声明方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235839/