我最近偶然发现了看起来像这样的代码,我无法绕过它:
template<typename T>
class A
{
}
class B: A<B>
{
}
所以我的一般问题是:
B
甚至没有A<B>
,那么类B
如何从模板类{{1}}继承定义了吗?答案 0 :(得分:2)
其中一项功能:此模板模式可以帮助您避免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();
这样可以避免虚函数调用。这样做可以提高性能......