CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++中实现编译期静态多态的经典技术,它通过模板继承和递归类型推导,在零运行时开销的情况下实现多态行为。下面通过分层解析揭示其核心机制:
一、基本模式结构
template <typename Derived>
class Base {
public:
void interface() {
static_cast<Derived*>(this)->implementation(); // 关键转型
}
};
class Derived : public Base<Derived> {
// 递归模板参数
public:
void implementation() {
cout << "Derived implementation" << endl;
}
};
核心特点:
- 基类是模板类,模板参数为派生类类型
- 派生类继承时将自己作为模板参数传递给基类
- 通过
static_cast<Derived*>(this)在编译期完成方法绑定
二、工作原理图解
+-------------------+ +-------------------+
| Base<Derived> | | Derived |
|-------------------| |-------------------|
| +interface() | | +implementation() |
| static_cast → |───────| |
+-------------------+ +-------------------+
- 当调用
Derived().interface()时:- 编译器实例化
Base<Derived> static_cast将this转为Derived*类型- 直接调用
Derived::implementation()
- 编译器实例化
- 零虚函数开销:所有调用在编译期静态绑定
三、对比动态多态
| 特性 | CRTP(静态多态) | 虚函数(动态多态) |
|---|---|---|
| 绑定时机 | 编译期 | 运行期 |
| 性能开销 | 无虚表查找 | 虚函数表跳转 |
| 内存占用 | 无虚表指针 | 每个对象含vptr |
| 适用场景 | 高性能模板库 | 运行时多态需求 |
四、典型应用场景
1. 静态多态接口
template <typename T>
class Drawable {
public:
void draw() {
static_cast<T*>(this)->render();
}
}

2060

被折叠的 条评论
为什么被折叠?



