1

示例 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> >
...
4

1 回答 1

1

按照你的方式,编译器不可能匹配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>

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

于 2012-09-29T15:31:57.687 回答