CRTP是一种通过模板参数将派生类传给基类实现静态多态的技术,基类使用static_cast调用派生类方法,编译期绑定无虚表开销。1. 形式为template<typename Derived> class Base { void interface() { static_cast<Derived*>(this)->implementation(); } }; 2. 派生类继承Base<Derived>并实现对应方法。3. 调用execute等接口时在编译期确定run实现,高效且类型安全。4. 优势包括零运行时开销、编译期检查、适合固定类型集合,常用于表达式模板、数值计算等性能敏感场景。5. 局限是不支持运行时多态,无法用基类指针统一管理不同派生类对象,错误信息可能复杂。

在C++中,想在不使用虚函数的前提下实现多态行为,可以借助CRTP(Curiously Recurring Template Pattern)来实现编译期的静态多态。这种方式将派生类作为模板参数传给基类,让基类在编译时就能“知道”派生类的类型,从而调用其具体实现,避免运行时开销。
CRTP是一种设计模式,形式如下:
template <typename Derived>
class Base {
public:
void interface() {
static_cast<Derived*>(this)->implementation();
}
};
class Derived : public Base<Derived> {
public:
void implementation() {
// 具体实现
}
};
基类通过模板参数获取派生类类型,利用static_cast把this转为派生类指针,直接调用其方法。这个过程在编译期完成,没有虚表开销,属于静态多态。
假设我们有一组操作类,都需要实现run()方法,但各自行为不同。我们可以这样设计:
立即学习“C++免费学习笔记(深入)”;
template <typename Impl>
class TaskBase {
public:
void execute() {
static_cast<Impl*>(this)->run();
}
};
class PrintTask : public TaskBase<PrintTask> {
public:
void run() {
std::cout << "打印任务执行\n";
}
};
class SaveTask : public TaskBase<SaveTask> {
public:
void run() {
std::cout << "保存任务执行\n";
}
};
调用时:
PrintTask pt; SaveTask st; pt.execute(); // 输出:打印任务执行 st.execute(); // 输出:保存任务执行
每个execute()调用都在编译期绑定到对应run()实现,效率高且类型安全。
run(),编译会报错。典型用途包括:表达式模板、数值计算库(如Eigen)、事件处理器、策略模式等。
std::variant)。基本上就这些。CRTP不是替代继承多态的万能方案,但在追求性能和类型安全的场景下非常实用。关键是理解“基类通过模板参数反向访问派生类”这一核心思想。
以上就是c++++怎么实现一个基于CRTP的静态多态_c++模板继承实现编译期多态技巧的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号