一个类如何从基于自身的模板继承?

时间:2011-12-01 03:32:15

标签: c++ templates generics

在阅读文章时,我遇到了以下语法:

template <typename T>
class MyTemplate
{
    T* member;
    T* method();
    // ...
}

class MyClass : public MyTemplate<MyClass>
{
    // ...
}

我并不完全理解MyClass如何从基于自身的模板继承。你能解释一下它是如何工作的吗?

3 个答案:

答案 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();
}

这是完全合法且可以理解的。