第二章–2.3–奇异递归模板

Aki 发布于 2022-11-25 385 次阅读


奇异递归模板(Curiously Recurring Template Pattern,CRTP)正如其名,是一种递归式利用c++模板的设计模式,更一般地被称作F-bound polymorphism

该方法是C++模板编程的一种惯用法:把派生类作为基类的模板参数,从而让基类可以使用派生类提供的方法。这种方法初看和它的名字一样奇怪,但在一定场景下相当有用,最早课追溯到C++模板诞生之时。这种方式一般有如下两种用途:

  • 代码复用:由于子类派生于模板基类,因此可以复用基类的方法。
  • 编译时多态:由于基类是与i个模板类,能够获得传递进来的派生类,进而可以调用派生类的方法,达到多态的效果。与运行时多态相比没有虚函数表开销。

根据定义,模板代码通常是如下形式。

template<class T> struct Base{};
struct Derived : Base<Derived>{};

2.3.1、代码复用

访问者模式(Visitor Pattern)是面向对象编程中一个经典的设计模式,虽然现代C++使用std::variant和std::visit来代替访问模式,但作为代码复用的例子值得一提。

这个模式的基本想法如下:假设拥有一个由不同种类的对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法可以访问到的对象结构中不同类型的元素做出不同的反应。