专用版本是否可以与原始模板类共享某些功能?

时间:2016-10-14 03:14:47

标签: c++ c++11 templates visual-c++ template-specialization

类的专用版本是否可以共享原始模板类的部分或全部功能?

即。考虑有一个模板类,

template <typename T>
class A
{
    A()
    {}
    A(const A& ref)
    {}
    void f1()
    {
        //do something
    }
    void f2()
    {
        //do something
    }
    void f3()
    {
        //do something
    }
}

它有一个特定数据类型的专用版本,除了原始的通用功能之外,它只打算在通用版本中添加一些附加功能。

template<>
class A<int>
{
    void f4()
    {
        //do something
    }
}

现在我特别想要的是这个专用版本可以从包含构造函数的通用版本中共享所有内容。

1 个答案:

答案 0 :(得分:1)

通常可以通过重构类层次结构来实现它:

template <typename T>
class A_base
{
     // All the f1() functions, et. al, implemented here
};

template<typename T> class A : public A_base<T> {

public:

     // An empty shell of a class, with the constructor
     // forwarding its arguments to the superclass.

     template<typename ...Args> A(Args && ...args)
          : A_base(std::forward<Args>(args)...)
     {
     }
};

template<>
class A<int> : public A_base<int>
{
    // Same constructor.

    void f4()
    {
        //do something
    }
};

您最终将所有类方法,类成员移动到基类中,模板类只包含从基类模板派生而来;否则就是一个空的外观。

然后,您的专业化以相同的方式从基类派生,并添加自己的方法。

另一种选择是“向后”实现这种推导。

// Empty template class.

template<typename T> class A_extra {};

// Your specialization, with the extra method:

template<>
class A_extra<int> {

    void f4()
    {
    }
};

// And the template class inherits from it:

template<typename T> class A : public A_extra<T> {

   // Your template class
};

根据模板类的特定细节,一种或另一种方法应该有效;或同一主题的一些变化。