C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
2011-06-06 10:04
691 查看
意图:
使用派生类作为模板参数特化基类。
与多态的区别:
多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定)
在实现多态时,需要重写虚函数,因而这是运行时绑定的操作。
然而如果想在编译期确定通过基类来得到派生类的行为,CRTP便是一种独佳选择,它是通过派生类覆盖基类成员函数来实现静态绑定的。
范式:
示例代码:
缺点:
CRTP由于基类使用了模板,目前的编译器不支持模板类的导出,因而不能使用导出接口。
其它使用领域:
在数值计算中,往往要对不同的模型使用不同的计算方法(如矩阵),一般使用继承提供统一接口(如operator运算符),但又希望不损失效率。这时便又可取CRTP惯用法,子类的operator实现将覆盖基类的operator实现,并可以编译期静态绑定至子类的方法。
英文链接:http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern
使用派生类作为模板参数特化基类。
与多态的区别:
多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定)
在实现多态时,需要重写虚函数,因而这是运行时绑定的操作。
然而如果想在编译期确定通过基类来得到派生类的行为,CRTP便是一种独佳选择,它是通过派生类覆盖基类成员函数来实现静态绑定的。
范式:
class derived : public base<derived> { // attributes and behaviors }
示例代码:
template <class Derived> struct base { void interface() { // 转换为子类指针,编译期将绑定至子类方法 static_cast<Derived*>(this)->implementation(); } static void static_interface() { // 编译期将绑定至子类方法 Derived::static_implementation(); } // 下面两个方法,默认实现可以存在,或者应该被继承子类的相同方法覆盖 void implementation(); static void static_implementation(); }; // The Curiously Recurring Template Pattern (CRTP) struct derived_1 : base<derived_1> { // 这里子类不实现,将使用父类的默认实现 //void implementation(); // 此方法将覆盖父类的方法 static void static_implementation(); }; struct derived_2 : base<derived_2> { // 此方法将覆盖父类的方法 void implementation(); // 这里子类不实现,将使用父类的默认实现 //static void static_implementation(); };
缺点:
CRTP由于基类使用了模板,目前的编译器不支持模板类的导出,因而不能使用导出接口。
其它使用领域:
在数值计算中,往往要对不同的模型使用不同的计算方法(如矩阵),一般使用继承提供统一接口(如operator运算符),但又希望不损失效率。这时便又可取CRTP惯用法,子类的operator实现将覆盖基类的operator实现,并可以编译期静态绑定至子类的方法。
英文链接:http://en.wikibooks.org/wiki/More_C++_Idioms/Curiously_Recurring_Template_Pattern
相关文章推荐
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++惯用法:奇特的递归模板模式(Curiously Recurring Template Pattern,CRTP,Mixin-from-above)
- C++ 模板:奇特递归模板模式(Curiously Recurring Template Pattern -CRTP)和 静多态(Static polymorphism)
- 递归模板模式--The curiously recurring template pattern
- 模板与继承之艺术——奇特的递归模板模式(CRTP)
- STL源码剖析 05 基础-CRTP奇特的递归模式模板 子类作为父类的模板参数
- C++惯用法:奇特的递归模板模式
- 模板模式(Template Pattern)
- 模板方法模式(Template Method Pattern)
- 模板模式(Template Pattern)
- 设计模式 - Template Method Pattern(模板方法模式)
- 第 9 章 模板方法模式【Template Method Pattern】
- 模板方法模式(Template Pattern)
- 模板方法模式【Template Method Pattern 】
- 设计模式——模板模式(Template Pattern)
- 您的设计模式——模板方法模式【Template Method Pattern】
- Java设计模式--模板方法模式【Template Pattern】
- 设计模式学习—模板模式(Template Design Pattern)
- 模板模式 Template Pattern