换句话说:是否可以创建一个继承自其基础的模板特化,如下所示:
template <class T>
class A{};
template <>
class A<int>:public A<>{};
这样A具有A的所有功能? 我是新来的,所以我不知道如何格式化,以防代码出错。
答案 0 :(得分: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> { … };
此处,void
表示基础(您也可以使用专用标记Base
,但void
正常工作)和Derived
,一个空结构,表示派生类
现在您可以按如下方式实例化和使用模板:
A<int> the_base;
A<int, Derived> the_derived;
the_base.do_something();
the_derived.do_something();
对于一个真实的例子,请考虑SeqAn的String
类:
String<Dna> some_dna = "GATTACA";
String<Dna, Packed> more_dna = "GATTACA";
第二种类型派生自第一种类型,但是是一种特殊的包装其字符尽可能紧密(对于DNA,这意味着在每个字节中放入四个DNA字符)。