CRTP是C++中的一种模板编程惯用法,全称为Curiously Recurring Template Pattern,即奇异递归模板模式。它是一种特殊的模板技术和使用方式,主要表现为基类是一个模板类,而派生类在继承基类时,将自身作为模板参数传递给基类。
CRTP的特点:
- 基类是一个模板类。
- 派生类继承该基类时,将派生类自身作为模板参数传递给基类。
优点:
- 实现静态多态,即在编译时就确定方法的调用,提高效率。
- 允许基类通过模板机制访问派生类的成员,从而将一些通用的功能封装在基类中,而具体的实现则在派生类中完成。
- 提供了一种在编译时处理多态的方式,避免了虚函数的运行时开销,提高了性能。
- 由于是在编译时处理,相关的类型错误会在编译阶段被捕捉和报告,增加了开发过程中的类型安全性。
代码示例
#include <iostream>
template<class T>
class Base {
public:
void func() {
if (auto t = static_cast<T*>(this)) {
t->op();
}
}
};
class Derived : public Base<Derived> {
public:
void op() {
std::cout << "Derived::op()" << std::endl;
}
};
int main() {
Derived d;
d.func();
return 0;
}