2016-10-14 33 views
0

某个类的专门版本可能共享原始模板类的部分或全部功能吗?专用版本可能与原始模板类共享某些功能吗?

即考虑有一个模板类,

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

现在我特别希望的是,这个专门的版本,从它的通用版本,包括构造函数如果可能的话可以分享一切。

+2

也许继承是一个更好的选择吗? –

+0

不,它不可能像你想的那样直。记住这一点:每个模板专业化是一个单独的类定义,具有不同的类型(因此,名称(编译器,无论它们看起来像是同名) –

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

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