例子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 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>

这样,编译器就不必尝试弄清楚您打算使用什么基类。

10-01 10:59