参见英文答案 >
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();
这样就可以避免虚函数调用.这可以通过一些性能改进来完成……