在阅读文章时,我遇到了以下语法:
template <typename T>
class MyTemplate
{
T* member;
T* method();
// ...
}
class MyClass : public MyTemplate<MyClass>
{
// ...
}
我并不完全理解MyClass
如何从基于自身的模板继承。你能解释一下它是如何工作的吗?
答案 0 :(得分:9)
这称为Curiously Recurring Template Pattern,简称CRTP。它通过利用以下事实来实现静态多态性的效果:当您到达行MyTemplate<MyClass>
中的class MyClass : public MyTemplate<MyClass>
时,MyClass
是半定义的(它是一个不完整的类型)所以你可以存储指向那种类型的指针等,并用它做一些不需要完整类型的东西。
答案 1 :(得分:2)
嗯......它只是......吗?该标准特别允许模板参数为不完整类型。由于CRTP基类中的方法都不需要完全定义的类型,所以一切都很好。请您解释一下这是如何运作的?
§3.9.2p3[basic.compound]
允许指向不完整类型的指针虽然对它们可以做什么有限制(3.11)。§14.3.1p2[temp.arg.type]
[注意:模板类型参数可能是不完整类型(3.9)。 - 后注]
答案 2 :(得分:2)
这称为CRTP。它用于静态多态,可以比使用虚拟更快。
: public MyTemplate<MyClass>
实例化MyTemplate<MyClass>
,但由于MyClass不完整,因此您只能以不需要完整类型的方式使用T
。比如使用指针或调用成员函数。
无论如何,只要看一下你的片段,它基本上与此相同:
class MyClass
{
MyClass* member;
MyClass* method();
}
这是完全合法且可以理解的。