【问题标题】:Can I make a template specialisation that inherits from its base?我可以制作一个从其基础继承的模板特化吗?
【发布时间】:2012-05-30 09:06:04
【问题描述】:

换句话说:是否可以创建一个从其基类继承的模板特化,如下所示:

template <class T>  
class A{};  
template <>  
class A<int>:public A<>{};  

这样 A 就具有 A 的所有功能? 我是新来的,所以我不知道如何格式化,以防万一代码出现错误。

【问题讨论】:

    标签: c++ templates inheritance


    【解决方案1】:

    你可以,但有点诡计。这种模式有时称为“模板子类化”,并在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 字符)。

    【讨论】:

    • @HighCommander 我很欣赏带有更正的编辑,但是下次如果您可以在原始提交后稍等片刻,以防原作者仍在编辑他自己的帖子(就像这种情况一样)在这里)。
    猜你喜欢
    • 2014-11-20
    • 2011-04-24
    • 1970-01-01
    • 2011-01-21
    • 2013-01-24
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多