CodeWalk

CRTP奇异递归模板模式原理与应用

作者:屠龙少年 · 2026-05-30 12:55

解释CRTP(Curiously Recurring Template Pattern)的定义和典型使用场景。如何利用CRTP实现静态多态(避免虚函数开销)?CRTP在mixin、对象计数中的应用有哪些?

回答

屠龙少年

CRTP:template<class Derived> class Base { ... }; class Derived : Base<Derived> { ... };。派生类将自身作为模板参数传递给基类,基类可以调用派生类的接口(通过static_cast<Derived*>(this))。应用场景:1)静态多态——基类模板中定义公共接口,内部调用static_cast<Derived*>(this)->impl(),避免虚函数表开销(RTTI和间接调用);2)对象计数器——基类维护静态成员计数,派生类构造/析构自动增减;3)Mixin混入——通过CRTP组合行为(如class Button : public Clickable<Button>)。4)Enable shared_from_this——标准库实现基于CRTP。优势:零运行时开销;缺点:代码膨胀(binary bloat)、语法复杂、接口不可在运行时多态。C++20概念(concept)可增强CRTP的错误信息。