c++ 设计模式之CRTP

CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)是 C++ 中一种常见的静态多态实现技术,也是很多高性能库(如 Eigen、Boost、LLVM)中的核心设计模式之一。


💡 CRTP 本质定义

CRTP 是一种用子类作为模板参数传递给父类的技术。

📌 基本语法:

cpp 复制代码
template <typename Derived>
class Base {
public:
    void interface() {
        // 调用派生类实现的方法
        static_cast<Derived*>(this)->implementation();
    }

    // 可选默认实现
    void implementation() {
        std::cout << "Base implementation\n";
    }
};

class Derived : public Base<Derived> {
public:
    void implementation() {
        std::cout << "Derived implementation\n";
    }
};

调用方式:

cpp 复制代码
int main() {
    Derived d;
    d.interface();  // 输出:Derived implementation
}

✅ CRTP 的主要用途

1. 实现静态多态(Static Polymorphism)

  • 替代虚函数机制,避免运行时开销(如 vtable、动态绑定等)。

2. 代码复用

  • 基类可以定义通用接口逻辑,细节延迟到派生类实现。

3. 在编译期做优化

  • 比如 Eigen 库使用 CRTP 编写矩阵类,实现表达式模板,从而避免中间对象、提升性能。

🧠 CRTP 与虚函数的对比

特性 虚函数(动态多态) CRTP(静态多态)
多态绑定 运行时 编译期
开销 有虚表开销 零开销
灵活性 更高 限制派生结构
可扩展性 较低
使用场景 插件式架构、通用接口 高性能场景、模板库

📦 典型应用案例

1. 编写通用操作接口

cpp 复制代码
template <typename Derived>
class Shape {
public:
    void draw() {
        static_cast<Derived*>(this)->drawImpl();
    }
};

class Circle : public Shape<Circle> {
public:
    void drawImpl() {
        std::cout << "Drawing Circle\n";
    }
};

class Square : public Shape<Square> {
public:
    void drawImpl() {
        std::cout << "Drawing Square\n";
    }
};

2. 实现计数器(统计子类个数)

cpp 复制代码
template <typename T>
class Counter {
public:
    Counter() { ++count; }
    static int count;
};

template <typename T>
int Counter<T>::count = 0;

class MyClassA : public Counter<MyClassA> {};
class MyClassB : public Counter<MyClassB> {};

🔍 高级话题

与策略模式结合

cpp 复制代码
template <typename Derived>
class Sorter {
public:
    void sort() {
        static_cast<Derived*>(this)->doSort();
    }
};

class QuickSorter : public Sorter<QuickSorter> {
public:
    void doSort() {
        std::cout << "Quick Sort\n";
    }
};

表达式模板(如 Eigen)

Eigen 用 CRTP 实现表达式模板,以支持像 C = A + B 这样的操作不会生成临时变量,而是按需展开计算。


🧩 总结

项目 说明
类型 模板设计模式
优势 静态多态、零开销
缺点 结构固定、调试复杂
典型使用 Eigen、Boost、LLVM

ps:Eigen 是一个 高性能 C++ 线性代数库,广泛用于矩阵运算、向量计算、数值解法等领域。许多著名的框架都使用它作为矩阵运算库。例如TensorFlow,OpenCV等。

相关推荐
玖剹16 分钟前
递归练习题(四)
c语言·数据结构·c++·算法·leetcode·深度优先·深度优先遍历
西部秋虫1 小时前
YOLO 训练车牌定位模型 + OpenCV C++ 部署完整步骤
c++·python·yolo·车牌识别
雾岛听蓝3 小时前
C++ 类和对象(一):从概念到实践,吃透类的核心基础
开发语言·c++·经验分享·笔记
Dream it possible!3 小时前
LeetCode 面试经典 150_图_克隆图(90_133_C++_中等)(深度优先:DFS)
c++·leetcode·面试·
鸭子程序员4 小时前
c++ 算法
开发语言·c++·算法
不会c嘎嘎4 小时前
算法百练,直击OFFER -- day5
c++·算法
序属秋秋秋4 小时前
《Linux系统编程之进程环境》【环境变量】
linux·运维·服务器·c语言·c++·操作系统·系统编程
乌萨奇也要立志学C++5 小时前
【洛谷】二分查找专题 告别二分死循环!模板 + 细节 + 实战
c++·算法
Rock_yzh5 小时前
LeetCode算法刷题——128. 最长连续序列
数据结构·c++·算法·哈希算法
wheeldown5 小时前
【Rokid+CXR-M】基于Rokid CXR-M SDK的博物馆AR导览系统开发全解析
c++·人工智能·ar