`

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
分享到:
评论

相关推荐

    The Giant Black Book of Computer Viruses

    while curiously giving you just enough technical details about viruses so you don’t feel like you’ve been cheated. Rather, this book is technical and to the point. Here you will find complete ...

    Thinking in Java 4th Edition

    What’s Inside Preface 1 Java SE5 and SE6 .................. 2 Java SE6 ............................................The 4th edition...........................Changes ...........................................

    MAC Security Bible

    And yet, curiously, some guy seems to have come up with enough to say about Mac security to fill a rather thick and heavy book. How can that be? Are Macs really as insecure as other computers — and...

    Molecular Electronics From Principles to Practice

    He broadcast from Concorde in its early days and he introduced us to the pocket calculator, microwave oven and the barcode (but curiously did not foresee the Internet). In several programmes, ...

    后端开发是一个涉及广泛技术和工具的领域.docx

    后端开发是一个涉及广泛技术和工具的领域,这些资源对于构建健壮、可扩展和高效的Web应用程序至关重要。以下是对后端开发资源的简要介绍: 首先,掌握一门或多门编程语言是后端开发的基础。Java、Python和Node.js是其中最受欢迎的几种。Java以其跨平台性和丰富的库而著名,Python则因其简洁的语法和广泛的应用领域而备受欢迎。Node.js则通过其基于JavaScript的单线程异步I/O模型,为Web开发提供了高性能的解决方案。 其次,数据库技术是后端开发中不可或缺的一部分。关系型数据库(如MySQL、PostgreSQL)和非关系型数据库(如MongoDB、Redis)各有其特点和应用场景。关系型数据库适合存储结构化数据,而非关系型数据库则更适合处理大量非结构化数据。 此外,Web开发框架也是后端开发的重要资源。例如,Express是一个基于Node.js的Web应用开发框架,它提供了丰富的API和中间件支持,使得开发人员能够快速地构建Web应用程序。Django则是一个用Python编写的Web应用框架,它采用了MVC的软件设计模式,使得代码结构更加清晰和易于维护。

    华为数字化转型实践28个精华问答glkm.pptx

    华为数字化转型实践28个精华问答glkm.pptx

    新员工入职培训全流程资料包gl.zip

    新员工入职培训全流程资料包(100+个文件) 1入职流程指引 万科新职员入职通知书 万科新职员入职引导手册 新进员工跟进管理表 新员工入职报到工作单(文职) 新员工入职报到流程 新员工入职流程表 新员工入职手续办理流程(工厂 新员工入职手续清单 新员工入职须知 新员工入职训流程 新员工入职引导表(导师用) 2 入职工具表格 3 培训方案计划 4培训管理流程 5培训教材课件 6 培训效果检测 7 员工管理制度 8 劳动合同协议 9 新员工培训PPT模板(28套)

    三菱PLC通讯程序实例

    FX5U PLC作为主、从站的通讯方式程序实例,以及包含详细说明文件...

    技术需求报告-集行波测距与故障录波功能于一体的电网综合故障分析系统.docx

    技术需求报告-集行波测距与故障录波功能于一体的电网综合故障分析系统.docx

    最新二开版本源码博客论坛源码,UI很漂亮,可切换皮肤界面.rar

    最新二开版本源码博客论坛源码,UI很漂亮,可切换皮肤界面.rar最新二开版本源码博客论坛源码,UI很漂亮,可切换皮肤界面.rar

    2024-2030全球及中国广谱防晒霜行业研究及十五五规划分析报告.docx

    2024-2030全球及中国广谱防晒霜行业研究及十五五规划分析报告

    基于Qt Creator实现中国象棋人机对战, c++实现.zip

    基于Qt Creator实现中国象棋人机对战, c++实现.zip

    华为用“三阶段十二步”法保证业务战略引领数字化转型glkx.pptx

    华为用“三阶段十二步”法保证业务战略引领数字化转型glkx.pptx

    基于matlab实现自适应稳健波束形成对角加载算法,其与输入信噪比的关系.rar

    基于matlab实现自适应稳健波束形成对角加载算法,其与输入信噪比的关系.rar

    热塑性弹性体,全球前21强生产商排名及市场份额.docx

    热塑性弹性体,全球前21强生产商排名及市场份额

    基于python+django网易新闻+评论的舆情热点分析平台(源码+论文+演示视频)

    详见:https://blog.csdn.net/Timi2019/article/details/138357258 【项目技术】 python+Django+mysql 【实现功能】 网站前台: (1)用户可以在不登录的情况下访问本系统,但是不能进行数据的分析,也不能对自己的个人信息进行修改。 (2)用户的注册与登录:游客想要在一个网站对自己的信息进行修改的话,需要经过一系列的有验证信息的注册,成为网站的正式用户后,可以编辑或修改自己的个人信息。 (3)评论分析:用户可以在网站内对所有的评论进行查看和分析。 (4)个人信息:通过个人信息查看功能可以查看自己的个人信息,还可以对密码进行修改。 (5)系统简介:用户可以在网站的首页上查看系统的信息,如用户数量、新闻数量、评价数量等信息。 网站后台: (6)用户信息管理:管理员可以查看和维护网站内所有的用户信息,可以通过用户的编号或者用户名进行查找,查找到具体的用户后可以对用户的信息进行修改,也可以直接删除用户的信息。 (7)新闻管理模块:后台管理员可以对网站内的新闻信息进行管理

    某知名大型集团信息化项目建设方案qy.pptx

    某知名大型集团信息化项目建设方案qy.pptx

    基于matlab实现潮流计算程序,MATLAB潮流计算程序.rar

    基于matlab实现潮流计算程序,MATLAB潮流计算程序.rar

    Python开发数据分析和机器学习平台源码

    搭建数据分析和机器学习平台,实现如下功能:设计一个网页版的用户界面,支持从本地选取数据集、自动可视化分析、查看训练记录、查看训练模型参数和绘图和支持完成机器学习任务。核心工具:streamlit和pycaret,部署和运行方便,只需streamlit run main.py命令即可。

    一种统一的单隐层的前馈网络(SLFNs)的在线序列学习算法-前馈网络、ELM、OS-ELM

    一种统一的单隐层的前馈网络(SLFNs)的在线序列学习算法。该算法被称为在线序极端学习机器(OS-ELM),可以学习固定或不同块大小的逐块或逐块数据)。OS-ELM中加性节点的激活函数可以是任意有界的不变分段连续函数,RBF节点的激活函数可以是任意可积的分段连续函数。在OS-ELM中,随机选择隐藏节点的参数(加性节点的输入权值和偏差或RBF节点的中心和影响因子),并根据顺序到达的数据解析确定输出权值。该算法采用了Huang等人开发的批处理学习的思想,该思想已被证明比其他批处理训练方法非常快。除了选择隐藏节点的数量外,还不需要手动选择其他控制参数。

Global site tag (gtag.js) - Google Analytics