【问题标题】:Is it possible for a specialized version to share some functionalities with the original template class?专用版本是否可以与原始模板类共享某些功能?
【发布时间】:2016-10-14 03:14:47
【问题描述】:

一个类的特殊版本是否可以共享原始模板类的部分或全部功能?

即考虑有一个模板类,

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
    }
}

现在我特别想要的是,这个专用版本可以共享其通用版本中的所有内容,包括构造函数(如果可能)。

【问题讨论】:

  • 也许继承在这里是更好的选择?
  • 不,不可能如你所愿。请记住这一点:每个模板特化都是一个单独的类定义,具有不同的类型(因此名称(对于编译器,无论它们在您看来是否具有相同的名称。
  • 如果您不知道,可以专门化类模板的各个功能,而无需专门化整个类。

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


【解决方案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
};

根据模板类的具体细节,一种或另一种方法应该可以工作;或同一主题的一些变体。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多