c++ - 使用从模板类继承的非模板类的部分特化

标签 c++ templates inheritance partial-specialization

例子1

如果我们有BaseDerived

class Base
{};
class Derived : public Base
{};

和一个模板类

template <class T, class Enabler=void>
class Partialy
{
public:
    void say()
    {
        std::cout << "Partialy Default" << std::endl;
    }
};

接下来我们可以写一个偏特化:

template <class T>
class Partialy<T, typename std::enable_if<std::is_base_of< Base, T >::value>::type>
{
public:
    void say()
    {
        std::cout << "Partialy special" << std::endl;
    }
};

示例 1 可以正常工作。 (完整代码:http://ideone.com/4FyrD)

例子2

如果我将 Base 类模板设为一个:

template <class T>
class BaseTpl
{};
class DerivedTpl : public BaseTpl<int>
{};

下一个偏特化不起作用:

template <class T, class Ta>
class Partialy<T, typename std::enable_if<std::is_base_of< BaseTpl<Ta>, T >::value>::type>
{
public:
    void say()
    {
        std::cout << "Partialy special with TPL" << std::endl;
    }
};

示例 2 无法编译 编译器抛出错误 “template parameters not used in partial specialization:”(完整代码:http://ideone.com/gZ6J2)

问题

那么问题来了。有什么方法可以编写适用于从 BaseTpl 派生的所有类的部分特化。

特化工作的类(class)列表:

class A1 : public BaseTpl<int>
class A2 : public BaseTpl<std::string>
class A3 : public BaseTpl<vector<int> >
...

最佳答案

按照您的方式,编译器不可能将 Ta 与任何类型相匹配。想象一下你有这个:

class DerivedTpl : public BaseTpl<int>, public BaseTpl<char>
{};

Ta 尝试匹配时会是什么类型?

对于您的特定问题,一种解决方案是在 BaseTpl 之上引入一个无所不包的基类:

class BaseNonTpl {};

template <class T>
class BaseTpl : BaseNonTpl
{};

然后,修改部分特化以查找该基类。

template <class T>
class PartialyTpl<T, typename std::enable_if<std::is_base_of< BaseNonTpl, T >::value>::type>

这样,编译器就不必尝试找出您打算使用的基类。

关于c++ - 使用从模板类继承的非模板类的部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12653922/

相关文章:

c++ - 将 SFML 与 Qt 创建者一起使用?

c++ - 如何有效地将按位运算应用于(大)压缩位 vector ?

c++ - 函数模板

java - 为什么子类对象使用父类方法会导致错误?

Java 继承或静态方法

java - 简单的java,字符串长度

c++ - Qt 如何找出 closeEvent(QCloseEvent *event) 从哪里触发

php - WooCommerce 中生成的项目(产品)表在哪里

c++ - 具有任意数量参数的模板函数

c++ - 重写的插槽 shouldInterruptJavaScript() 未被调用