CodeWalk

CRTP奇异递归模板模式详解

作者:孤独的心 · 2026-05-30 12:55

请解释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() { /* 具体实现 */ }
};

应用场景:

  1. 静态多态:避免虚函数开销,通过CRTP实现编译期多态
  2. 代码复用:如enable_shared_from_this
  3. 混入(Mixin):在编译期向类中添加功能
  4. 奇异递归泛型模式:如对象计数、单例模式

优点:零运行时开销。缺点:代码可读性降低,类型不兼容。