奇特递归模板模式

C++ 设计模式,它基于模板编程技术,允许子类(派生类)从一个模板基类中继承行为,并通过在派生类中实现具体的方法来自定义这些行为。CRTP 的核心思想是,派生类作为基类模板的模板参数,并且它继承了基类模板的成员和行为。

  • 模板基类: CRTP始于一个模板基类,其中包含通用行为、方法或属性,这些通用行为可以被派生类重用。通常,这些方法在基类中是作为非虚函数定义的。
  • 派生类: 派生类通过从模板基类继承,将自身作为基类模板的模板参数,实现了CRTP模式。它可以重写或实现基类中的方法,以自定义自己的行为。
  • 静态多态性: CRTP 利用了静态多态性的概念。由于在编译时就确定了使用哪个派生类,因此编译器可以进行优化,而不需要运行时的虚拟函数调用。
  • 奇怪的递归: CRTP之所以称为"奇怪的递归",是因为在派生类中将自身作为基类的模板参数,这种递归是在编译时展开的。
  • 用途: CRTP通常用于实现代码的复用和泛化。它允许将通用的功能从基类继承到多个派生类中,同时又保留了派生类的灵活性,可以根据需要自定义特定的行为。
#include 

// CRTP基类模板
template <typename Derived>
class Base {
public:
    void commonMethod() {
        // 基类中的通用方法
        std::cout << "Base common method." << std::endl;

        // 派生类特有的方法,调用Derived中的doSomething方法
        static_cast<Derived*>(this)->doSomething();
    }

    void sharedMethod() {
        // 基类中的共享方法
        std::cout << "Base shared method." << std::endl;
    }
};

// 派生类
class DerivedClass : public Base<DerivedClass> {
public:
    void doSomething() {
        // 派生类中实现的特有方法
        std::cout << "DerivedClass specific behavior." << std::endl;
    }
};

int main() {
    DerivedClass derived;
    derived.commonMethod();
    derived.sharedMethod();

    return 0;
}

你可能感兴趣的:(C++,C++,设计模式)