`

C++之Curiously recurring template pattern

    博客分类:
  • C++
C++ 
阅读更多
一种用于实现多态的方法,与虚函数的不同在函数的绑定是在编译期完成的,运行的速度更快!!

不多说了,直接上代码:


#include <iostream>

/*
@file 学习CRTP (Curiously recurring template pattern).
一种实现多态(polymorphism) 的方式,与虚函数的不同在于,CRTP的函数绑定是在编译期间完成的,因而执行效率更高。
CRTP通过 子类 继承 以子类为模板参数的父类 来实现。
共用代码的函数可以直接在父类中实现。
而对于不同子类需要不同实现的函数,只需要在父类的该函数中将父类静态转换为子类(父类转为子类没问题,因为我们用的总是子类!),并调用子类的该方法即可。
需要说明的一点是:对于需要多态的方法,由于父类的方法体只是一个函数调用,因而编译时是可以inline的。运行时完全没有额外的开销!
@link http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern
*/

///基类
template<typename Derived> class Base {
public:
    inline void interfaceMethod() {
        std::cout << __FUNCTION__ << std::endl;
        std::cout << "    ";
        //静态转换后调用子类的方法
        static_cast<Derived*> (this)->implementationMethod();
    }

    static void static_func()     {
        std::cout << __FUNCTION__ << std::endl;
        std::cout << "    ";

        Derived::static_sub_func(); //注意这里必须为静态方法!!
    }
};

///一个完好的子类的示例
class DerivedClass : public Base<DerivedClass> {
public:
    void implementationMethod() {
        std::cout << __FUNCTION__ << std::endl;
    }
    static void static_sub_func() {
        std::cout << __FUNCTION__ << std::endl;
    }
};

///没有实现所需方法的子类
class FalseDerivedClass : public Base<FalseDerivedClass> {
	
};

///虽然实现了所需方法,但不是基类的子类
class NotDerivedClass {
public:
    void implementationMethod() {
        std::cout << __FUNCTION__ << std::endl;
    }
    static void static_sub_func() {
        std::cout << __FUNCTION__ << std::endl;
    }
};

void main() {
    Base<FalseDerivedClass> base;
    //base.interfaceMethod(); //FalseDerivedClass 没实现该方法,编译自然就通不过

    Base<NotDerivedClass> baseNot;
    //baseNot.interfaceMethod(); //NotDerivedClass 不是Base的子类,实现了该方法编译也通不过

    DerivedClass derived;
    derived.interfaceMethod();
    derived.static_func();
}


输出如下:




参考链接:
http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern
  • 大小: 17.3 KB
分享到:
评论

相关推荐

    《C++ Templates 全览》

    - **偏锋技巧**: 包括Friend Name Injection、Curiously Recurring Template Pattern (CRTP)、Template Template Parameters (TTPs)、Member Templates等。 - **特殊设计**: 如Tuple、Traits Templates、Expression ...

    C++ template 全览 第一篇(1~5节)(简体中文)

    - **第11章**:CRTP(Curiously Recurring Template Pattern),深入理解这种高级模板技巧。 - **第四篇**:模板的实际应用。 - **第12章**:容器设计,展示如何使用模板实现高效容器。 - **第13章**:算法模板,...

    C++设计新思维.pdf

    - **灵活性**:支持多种编程模式和技术,如策略模式、CRTP(Curiously Recurring Template Pattern)等。 - **性能优势**:通过利用Template元编程的优势,在不牺牲运行时性能的前提下实现了代码的灵活性和扩展性。 ...

    C++11封装lua源代码

    库可能使用了虚函数表(vtable)或CRTP(Curiously Recurring Template Pattern)等技术来实现对C++类成员的调用。同时,为了在lua中访问和修改对象的成员变量,可能利用了lua_setfield和lua_getfield等API。 对于...

    C++Templates(中文版)

    - **Curiously Recurring Template Pattern (CRTP)**:一种设计模式,利用模板参数来表达继承关系,常用于编译时优化和类型安全的自我引用。 - **Template Template Parameters**:允许将模板作为模板参数传递,提供...

    Design Patterns in Modern C++

    作者在书中提及了一些重要的编程概念,如Curiously Recurring Template Pattern(好奇递归模板模式)、Mixin继承、以及属性(Properties)等,这些都是C++编程中的高级特性。同时,书中也讲述了设计原则,特别是...

    c++ templates 全览(侯捷)

    - **好奇重复模板模式(Curiously Recurring Template Pattern, CRTP)**:一种特殊的设计模式,其中基类依赖于派生类。 - **模板模板参数(Template Template Parameters)**:允许模板接受另一个模板作为参数。 - **...

    C++接口实现总结

    4. **CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)**:这是一种模板技巧,可以用来创建接口。一个模板类T作为另一个类B的基类,B的实例实际上是T的实例,这样B就可以强制实现T所要求的接口。 5...

    Microsoft Visual C++ 6.0 模板库参考手册.rar

    - 虽然模板不直接支持多态(如虚函数那样),但它可以通过模板和继承结合实现类似的效果,如CRTP(Curiously Recurring Template Pattern)。 9. **模板与性能**: - 使用模板可以提高代码效率,但过度使用可能...

    C++动态生成对象

    为了实现"属性注册",可以使用一种叫做元编程的技术,例如使用模板和CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)来创建一个属性系统。每个类可以继承一个属性基类,该基类包含注册属性的方法。...

    C++.Templates.-.The Complete.Guide(侯捷译)

    2. **Curiously Recurring Template Pattern(好奇的重复模板模式)**:这是一种设计模式,允许类继承自自身的一个模板实例,从而实现自我引用的行为。 3. **Template Template Parameters(模板模板参数)**:这是...

    Effective C++ & More Effective C++(en) chm

    6. **模板和继承的结合**:通过模板和继承的巧妙结合,可以实现更灵活的设计模式,如CRTP(Curiously Recurring Template Pattern)。 这些书籍深入讲解了C++的许多核心概念和最佳实践,对于任何想要提升C++技能的...

    C++反射机制实现

    为了处理这些问题,可能需要更复杂的元编程技术,如使用CRTP(Curiously Recurring Template Pattern)和成员函数指针,甚至考虑使用第三方库如Boost.Fusion或Modern C++ Reflection(C++20的实验性特性)。...

    STL课件_C++_课件stl_c++课件_源码.zip

    通常,STL的源码会展示如何使用模板元编程和设计模式来构建高度通用的组件,比如使用CRTP(Curiously Recurring Template Pattern)实现迭代器的基类。 在实际开发中,结合STL的使用,我们可以编写出更加优雅和高效...

    Efficient.C++ Performance Programming Techniques

    在性能敏感的代码中,可以考虑使用非虚函数和CRTP(Curiously Recurring Template Pattern)来实现静态多态。 8. **内存对齐与数据结构布局**:理解数据成员的内存对齐规则,优化数据结构布局,可以减少内存访问的...

Global site tag (gtag.js) - Google Analytics