

新闻资讯
技术学院CRTP是一种通过派生类继承自身为模板参数的基类实现静态多态的C++惯用法,用于替代虚函数以获得零开销抽象、编译期绑定及派生类静态信息访问。
CRTP(Curiously Recurring Template Pattern),中文常译作“奇异递归模板模式”,是 C++ 中一种借助模板和继承实现静态多态的惯用法。它的核心特点是:派生类以自身作为模板参数,继承自一个以该派生类为模板实参的基类。
典型结构如下:
templateclass Base { public: void interface() { static_cast (this)->implementation(); // 向下调用派生类函数 } }; class MyDerived : public Base { public: voi d implementation() { // 具体逻辑 } };
这里 MyDerived 继承自 Base,而 Base 又通过 static_cast 安全地调用派生类成员——这种“递归式”模板参数就是“奇异”的来源。
它主要替代虚函数机制,在编译期绑定调用,避免运行时开销和虚表间接访问。适用于:
sizeof(Derived)、类型别名、编译期常量)static_assert)CRTP 不只是简单转发调用,还能支撑更复杂的泛型设施:
clone()),各派生类提供 static 版本,无需虚析构constexpr 和类型特征,在基类中推导派生类字段布局(需 C++20 支持更多元的模板元编程)self() 成员函数,返回 static_cast(*this) ,避免重复书写 castCRTP 看似简洁,但使用时需谨慎:
Derived 是不完整类型,无法在基类中使用其成员(除指针/引用外)[[nodiscard]] 和清晰命名提升可读性new Base),所有实例必须是具体派生类型