加载中...
CRTP 是一种 C++ 惯用法:让基类模板以派生类自身作为模板参数,从而在基类中静态地获知派生类型。它借助模板在编译期实现类似虚函数的多态,而不付出运行时开销,常用于静态多态与代码复用。

| 中文名 | 奇异递归模板模式 |
| 外文名 | CRTP |
| 主要语言 | C++ |
| 类别 | 模板惯用法 |
| 实现效果 | 静态多态 |
| 典型应用 | enable_shared_from_this |
奇异递归模板模式(Curiously Recurring Template Pattern,CRTP)是一种 C++ 模板惯用法,其特征是让一个类派生自以它自己为模板参数的基类模板,即基类在定义时就静态地知道最终派生类型。
CRTP 的名字来源于其看似递归的形态:派生类把自身类型传给基类模板参数。由于这一信息在编译期即可确定,基类可以将 this 静态转换为派生类型并直接调用派生类成员,从而在不使用虚函数表的前提下实现多态行为,称为静态多态或编译期多态。它以模板换取了运行时虚调用的开销,同时保留了将通用逻辑上提到基类的复用能力。
CRTP 常用于性能敏感且类型在编译期已知的场景,如高性能库中的静态多态、为一批类批量注入通用能力(计数实例、比较运算符、克隆等混入式功能),以及表达式模板、策略注入等高级技巧。标准库中 enable_shared_from_this 就是 CRTP 的典型应用,允许对象安全地获取指向自身的共享指针。
问:CRTP 与虚函数多态如何取舍?答:CRTP 在编译期确定类型,零运行时开销但类型必须静态已知,不能通过基类指针统一容纳异构对象;虚函数支持运行期动态分派、可异构存储,但有虚表开销。需要运行时多态时用虚函数,追求性能且类型已知时用 CRTP。
问:CRTP 有什么风险?答:若派生类未正确传入自身类型,静态向下转型会导致未定义行为;此外模板展开会增加编译时间和代码体积,错误信息也较为晦涩。

| 中文名 | 奇异递归模板模式 |
| 外文名 | CRTP |
| 主要语言 | C++ |
| 类别 | 模板惯用法 |
| 实现效果 | 静态多态 |
| 典型应用 | enable_shared_from_this |
登录 后参与讨论
暂无讨论,来发表第一条评论吧