首页 > 后端开发 > C++ > 正文

c++中什么是CRTP(奇异的递归模板模式)_c++ CRTP解析

冰火之心
发布: 2025-10-13 13:48:01
原创
836人浏览过
CRTP通过派生类作为模板参数继承基类实现静态多态,编译期确定函数调用,避免虚函数开销,常用于性能敏感场景如表达式模板与计数器,具备零成本抽象和类型安全优势,但牺牲运行时多态与代码可读性。

c++中什么是crtp(奇异的递归模板模式)_c++ crtp解析

CRTP(Curiously Recurring Template Pattern),中文常译为“奇异的递归模板模式”,是C++中一种利用模板实现静态多态的技术。它通过让基类以派生类作为模板参数来继承自身,从而在编译期就能确定调用的具体函数,避免了虚函数带来的运行时开销。

CRTP的基本结构

CRTP的典型写法如下:

template <typename Derived><br>class Base {<br>public:<br>    void interface() {<br>        static_cast<Derived*>(this)->implementation();<br>    }<br><br>    void common_function() {<br>        // 一些通用逻辑<br>    }<br>};<br><br>class Derived : public Base<Derived> {<br>public:<br>    void implementation() {<br>        // 具体实现<br>    }<br>};
登录后复制

在这个例子中,Base 是一个类模板,接受一个类型参数 Derived,而 Derived 类继承自 Base<Derived>。这种“派生类作为模板参数传给基类”的结构就是CRTP的核心特征。

静态多态:替代虚函数的高效方式

传统多态依赖虚函数表,在运行时进行动态绑定。CRTP则在编译期完成函数解析,称为“静态多态”或“早绑定”。

立即学习C++免费学习笔记(深入)”;

比如,下面这个使用CRTP实现加法和乘法的例子:

template <typename T><br>struct Expression {<br>    const T& as_derived() const {<br>        return *static_cast<const T*>(this);<br>    }<br>};<br><br>struct DoubleValue : Expression<DoubleValue> {<br>    double val;<br>    DoubleValue(double v) : val(v) {}<br><br>    double eval() const { return val; }<br>};<br><br>struct Add : Expression<Add> {<br>    const Expression<auto>::type& left;<br>    const Expression<auto>::type& right;<br><br>    template <typename L, typename R><br>    Add(const L& l, const R& r) : left(l), right(r) {}<br><br>    double eval() const {<br>        return left.eval() + right.eval();<br>    }<br>};
登录后复制

虽然上面示例略作简化(实际中需更严谨的类型处理),但可以看出表达式模板如何利用CRTP在编译期构建计算结构,提升性能。

AiPPT模板广场
AiPPT模板广场

AiPPT模板广场-PPT模板-word文档模板-excel表格模板

AiPPT模板广场 147
查看详情 AiPPT模板广场

常见应用场景

  • 性能敏感代码:如数学库、表达式模板(Eigen等线性代数库广泛使用)。
  • 接口统一与代码复用:基类提供通用方法,派生类只实现特定逻辑。
  • 实现“自我引用”功能:例如对象克隆、日志记录、自动注册机制等。

举个简单的计数器例子:

template <typename Derived><br>class Counter {<br>private:<br>    inline static int count = 0;<br>public:<br>    Counter() { ++count; }<br>    ~Counter() { --count; }<br><br>    static int get_count() {<br>        return count;<br>    }<br>};<br><br>class MyType : public Counter<MyType> { };<br>// 每个类型独立计数
登录后复制

这样每个继承它的类型都有自己独立的计数器,互不干扰。

CRTP的优缺点

优点:

  • 零成本抽象:没有虚函数表开销。
  • 编译期解析,可内联优化,性能高。
  • 支持泛型编程和类型安全。

缺点:

  • 代码可读性较低,初学者不易理解。
  • 不能像虚函数那样灵活替换实现(运行时多态缺失)。
  • 模板膨胀可能导致编译产物变大。

基本上就这些。CRTP不是日常开发中必须掌握的技巧,但在追求性能或设计高度可复用组件时,它是一种非常强大且被广泛使用的C++惯用法。

以上就是c++++中什么是CRTP(奇异的递归模板模式)_c++ CRTP解析的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号