我最近遇到了这样的代码,但是我无法理解它:
template<typename T>
class A
{
}
class B: A<B>
{
}
我的一般问题是:
- 为什么这不会导致编译错误? 具体来说,如果
B
尚未定义,那么如何让类B
继承模板类A<B>
? - 这种结构什么时候会有必要?
我最近遇到了这样的代码,但是我无法理解它:
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();
这样可以避免虚函数调用。可以通过这种方式进行一些性能优化...
A
对象不能被强制转换为Item
指针来与B
对象分组,你为什么还需要虚拟调用呢? - flakes