CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++中一种高级的模板编程技术,它通过将派生类作为基类的模板参数来实现编译期多态。
1. CRTP的基本概念
基本结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
2. CRTP的核心原理
编译期多态
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
3. CRTP的常见应用
应用1:静态多态(编译期多态)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
|
应用2:计数器模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
应用3:多态拷贝(虚拟构造函数)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
应用4:静态接口检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
|
4. CRTP的高级用法
访问派生类成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
CRTP + 策略模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
6. CRTP的最佳实践
实践1:使用类型检查
1 2 3 4 5 6 7 8 9 |
|
实践2:保护构造函数
1 2 3 4 5 6 7 8 9 10 11 |
|
实践3:使用CRTP实现Mixin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
7. CRTP在实际项目中的应用
示例:数学向量库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
|
8. CRTP的局限性
- 编译时绑定:不能在运行时改变行为
- 代码膨胀:每个模板实例都会生成新代码
- 复杂的错误信息:模板错误信息难以理解
- 无法处理异质集合:需要知道具体类型
- 循环依赖:基类需要知道派生类的完整定义
9. 何时使用CRTP
适合使用CRTP的情况:
- 需要静态多态(性能关键)
- 实现混入(Mixin)功能
- 编译期策略选择
- 为类族添加通用功能
- 表达式模板
不适合使用CRTP的情况:
- 需要运行时多态
- 类型在运行时确定
- 需要存储异质对象的容器
- 项目对二进制大小敏感
总结
CRTP是C++模板元编程中的强大工具,它通过编译期多态提供了零开销的抽象能力。虽然学习曲线较陡,但在性能敏感的场景下,CRTP可以替代虚函数,提供更好的运行时性能。
记住CRTP的核心思想:基类通过static_cast将this指针转换为派生类指针,从而调用派生类的方法,所有这一切都在编译期完成。