【问题标题】:Subclass B Inherits From a Template Class A<B> [duplicate]子类 B 继承自模板类 A<B> [重复]
【发布时间】:2015-01-01 23:37:58
【问题描述】:

我最近偶然发现了这样的代码,我无法理解它:

template<typename T>
class A
{
}

class B: A<B>
{
}

所以我的一般问题是:

  • 为什么这不会产生编译错误?具体来说,如果 B 还没有定义,那么 B 类如何从模板类 A&lt;B&gt; 继承?
  • 什么时候需要这种结构?

【问题讨论】:

  • C++ 不使用一次性编译器。引用代码中进一步定义的内容是完全合法的。
  • 这被称为“奇怪重复的模板模式”。
  • @Remy Lebeau 谢谢!看起来像是一些有趣的阅读材料!
  • “为什么这不会产生编译错误?” 模板参数不需要是完整类型,除非模板以需要的方式使用参数它在实例化时是一个完整的类型。

标签: c++ templates inheritance metaprogramming


【解决方案1】:

其中一个特点:这个模板模式可以帮助你避免使用vtable。这称为“静态多态性” - http://en.m.wikipedia.org/wiki/Curiously_recurring_template_pattern

假设你有这样的代码结构:

class Item {
public:
    virtual void func() = 0;
}

class A : public Item {
// …
}

class B : public Item {
// …
}

Item *item = new A();
item->func();

可以这样替换:

template<typename T>
class Item {
public:
    void func() {
        T::func();
    }
}

class A : public Item<A> {
// …
}

class B : public Item<B> {
// …
}

Item<A> *item = new A();
item->func();

这样可以避免虚函数调用。这样做可以提高一些性能...

【讨论】:

  • 但是既然A 对象无法通过将Item 指针转换为Item 对象与B 对象进行分组,为什么还需要虚拟调用呢?
  • @Calpratt 如果类组合层次结构在编译时是固定的,这会很有帮助。我认为在这种情况下无法进行分组。
  • @Calpratt 这个具体的例子更好:stackoverflow.com/a/26718782/440168
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多