我可以创建一个继承自其基础的模板专门化吗?

StA*_*uth 4 c++ inheritance templates

换句话说:是否有可能创建一个继承自其基础的模板特化,如下所示:

template <class T>  
class A{};  
template <>  
class A<int>:public A<>{};  
Run Code Online (Sandbox Code Playgroud)

这样A有A的所有功能吗?我是新来的,所以我不知道如何格式化,以防代码出错.

Kon*_*lph 5

你可以用一点诡计.此模式有时称为"模板子类化",并在SeqAn库中广泛使用.

诀窍是为基类提供一个额外的模板参数标记,用于确定类型标识:

template <typename T, typename Spec = void>
struct A { … };

// inheritance tag:
struct Derived { };

template <typename T>
struct A<T, Derived> : public A<T, void> { … };
Run Code Online (Sandbox Code Playgroud)

这里,void表示基数(您也可以使用专用标记,Basevoid工作正常)Derived,空结构表示派生类.

现在,您可以按如下方式实例化和使用模板:

A<int> the_base;
A<int, Derived> the_derived;

the_base.do_something();
the_derived.do_something();
Run Code Online (Sandbox Code Playgroud)

对于一个真实的例子,请考虑StringSeqAn中的类:

String<Dna> some_dna = "GATTACA";
String<Dna, Packed> more_dna = "GATTACA";
Run Code Online (Sandbox Code Playgroud)

第二种类型来自第一种类型,但是是一种特殊化,它尽可能紧密地包装其字符(对于DNA,这意味着在每个字节中放入四个DNA字符).

  • @HighCommander我欣赏编辑一般的更正,但下次如果你可以在原始提交后稍等一下,以防原作者仍在编辑他自己的帖子(就像这里的情况那样)会很好. (2认同)