CRTP是C++中通过派生类继承自身为模板参数的基类模板实现静态多态的惯用法,编译期绑定、零运行时开销;典型用途包括实例计数、强制接口实现和操作符复用,与虚函数动态多态目标不同、不可混用。
CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++中一种利用模板和继承实现静态多态的惯用法:派生类以自身作为模板参数,继承自一个以它为参数的基类模板。
它在编译期就确定调用关系,无需虚函数表,零运行时开销。
关键在于基类是一个模板,而派生类继承时把**自己**作为模板实参传进去:
templateclass Base { public: void interface() { static_cast (this)->implementation(); // 编译期绑定 } }; class MyWidget : public Base
{ // 注意:这里传的是 MyWidget 自身 public: void implementation() { / 具体逻辑 / } };
这样,Base 就能安全地向下转型调用 MyWidget 的成员,且整个过程不涉及虚函数或动态查找。
CRTP 常用于在不侵入派生类的前提下,统一提供能力,比如:
Base 和 Base 的计数互不影响)interface() 中调用纯虚语义的 derived_func(),若派生类未定义,编译失败(比纯虚函数更早报错)operator==,基类模板通过 static_cast 比较两个派生对象的底层数据静态多态 ≠ 动态多态的简化版,而是设计目标不同:
vector> ),靠指针/引用来统一调度,有虚表开销和间接跳转Base 和 Base 是完全不同的类型,没有公共父类使用 CRTP 要小心语法和语义边界:
inline 定义在头文件中)sizeof 或声明其完整对象(此时派生类是不完全类型),但指针/引用没问题