c – 子类B继承自模板类A

参见英文答案 >
What is the curiously recurring template pattern (CRTP)?                                    5个

我最近偶然发现了看起来像这样的代码,我无法绕过它:

template<typename T>
class A
{
}

class B: A<B>
{
}

所以我的一般问题是:

>为什么这不会产生编译错误?具体来说,如果尚未定义B,B类如何从模板类A< B>继承?
>这个结构什么时候有必要?

最佳答案 其中一个功能:此模板模式可以帮助您避免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();

这样就可以避免虚函数调用.这可以通过一些性能改进来完成……

点赞