CRTP通过派生类作为模板参数继承基类实现静态多态,编译期确定函数调用,避免虚函数开销,常用于性能敏感场景如表达式模板与计数器,具备零成本抽象和类型安全优势,但牺牲运行时多态与代码可读性。

CRTP(Curiously Recurring Template Pattern),中文常译为“奇异的递归模板模式”,是C++中一种利用模板实现静态多态的技术。它通过让基类以派生类作为模板参数来继承自身,从而在编译期就能确定调用的具体函数,避免了虚函数带来的运行时开销。
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在编译期构建计算结构,提升性能。
举个简单的计数器例子:
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不是日常开发中必须掌握的技巧,但在追求性能或设计高度可复用组件时,它是一种非常强大且被广泛使用的C++惯用法。
以上就是c++++中什么是CRTP(奇异的递归模板模式)_c++ CRTP解析的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号