C++ 如何仅在类的模板参数通过某些测试时声明方法?

C++ 如何仅在类的模板参数通过某些测试时声明方法?,c++,C++,阅读了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; } //通过参数启用foo2重载 模板 T foo2(T,typename s

阅读了
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;
}
//通过参数启用foo2重载
模板
T foo2(T,typename std::enable_if::type*=0)
{
返回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;
}
类基
{
公众:
模板
void fun(){}
};
模板
派生类:公共基
{
公众:
模板
void fun(){}
};
int main()
{
衍生d1;
衍生d2;
返回0;
}
我该怎么做?目前,我得到:

错误:“struct std::enable_if”中没有名为“type”的类型


您可能希望对此使用部分专门化。在模板成员函数本身上使用
enable_if
(可以这样做,只需添加另一个默认值为
T
的模板参数,并在该参数上使用
enable_if

类基
{
公众:
模板
void fun(){std::cout
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
{

};