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

标签 c++

已阅读 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/

相关文章:

C++:将int的地址作为参数传递

c++ - MS Visual Studio Professional 2013 - C++ 为 32 位和 64 位操作系统编译单个可执行文件?

c++ - 在为标准模板函数创建仿函数对象时减少样板

c++ - 静态类成员

c++ - 放弃 CMainFrame 中的 ALT 按键操作

c# - 在 Windows 上拦截/重定向传出的 http 连接

c++ - 在无限循环中使用或不使用 join() 方法

c++ - 为什么 Unordered_Map 散列比我的简单数组散列太慢

c++ - 成为左操作数意味着什么?

c# - 什么会导致内存泄漏(或不断增加)?共享内存 DLL + C# 应用程序