CRTP(奇异递归模板模式)如何实现静态多态?

CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是C++中实现编译期静态多态的经典技术,它通过模板继承和递归类型推导,在零运行时开销的情况下实现多态行为。下面通过分层解析揭示其核心机制:


一、基本模式结构

template <typename Derived>
class Base {
   
   
public:
    void interface() {
   
   
        static_cast<Derived*>(this)->implementation(); // 关键转型
    }
};

class Derived : public Base<Derived> {
   
    // 递归模板参数
public:
    void implementation() {
   
   
        cout << "Derived implementation" << endl;
    }
};

核心特点

  1. 基类是模板类,模板参数为派生类类型
  2. 派生类继承时将自己作为模板参数传递给基类
  3. 通过static_cast<Derived*>(this)在编译期完成方法绑定

二、工作原理图解

+-------------------+       +-------------------+
| Base<Derived>     |       | Derived           |
|-------------------|       |-------------------|
| +interface()      |       | +implementation() |
|   static_cast →   |───────|                   |
+-------------------+       +-------------------+
  1. 当调用Derived().interface()时:
    • 编译器实例化Base<Derived>
    • static_castthis转为Derived*类型
    • 直接调用Derived::implementation()
  2. 零虚函数开销:所有调用在编译期静态绑定

三、对比动态多态

特性 CRTP(静态多态) 虚函数(动态多态)
绑定时机 编译期 运行期
性能开销 无虚表查找 虚函数表跳转
内存占用 无虚表指针 每个对象含vptr
适用场景 高性能模板库 运行时多态需求

四、典型应用场景

1. 静态多态接口
template <typename T>
class Drawable {
   
   
public:
    void draw() {
   
   
        static_cast<T*>(this)->render();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值