- 浏览: 692492 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (181)
- Matlab (16)
- Java (26)
- autoHotkey (4)
- openCV (1)
- C++ (50)
- PDF-XChange Viewer (2)
- 学术 (11)
- javascript (4)
- linux (11)
- SWT (9)
- latex (7)
- GAE (2)
- windows (6)
- C# (3)
- PS (20)
- JNI (4)
- latex,批处理 (0)
- 批处理 (4)
- Android (5)
- 矩阵论 (1)
- SVM (1)
- 概率图模型 (0)
- Python (12)
- Eigen (5)
- 编程题 (1)
- MKL (1)
- 神经网络 (9)
- 最优化 (2)
- 摄影 (1)
- PPT (0)
- After Effects (3)
- CUDA (3)
- caffe (0)
- MXNet (2)
- svn (1)
- R (0)
- 虚拟机 (0)
- tensorflow (7)
- theano (1)
- Keras (1)
- vim (1)
- xgboost (1)
- spark (6)
- eclipse (2)
- word2vec (0)
- hadoop (1)
- dmlc (1)
- git (0)
最新评论
-
jeffersonz:
请问大神,这个插件记录下来的脚本为什么不能再Extendscr ...
PhotoShop - 记录PS的所有操作为JavaScript代码 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道cherish ...
Eigen的编译选项;MKL的使用 -
cherishLC:
Andy__Zou 写道cherishLC 写道Andy__Z ...
Eigen的编译选项;MKL的使用 -
Andy__Zou:
cherishLC 写道Andy__Zou 写道 您好,您的工 ...
Eigen的编译选项;MKL的使用
一种用于实现多态的方法,与虚函数的不同在函数的绑定是在编译期完成的,运行的速度更快!!
不多说了,直接上代码:
输出如下:
参考链接:
http://en.wikipedia.org/wiki/Curiously_Recurring_Template_Pattern
不多说了,直接上代码:
#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
发表评论
-
C++函数中的静态变量
2019-07-19 11:22 820在C++中,可以在成员函数中使用静态变量,从而间接达到在hpp ... -
tensorflow 静态编译笔记 -- linux系统
2018-11-05 14:26 0注: 1、编译tensorflow静态库 很简单,参见: h ... -
gperftools笔记
2018-06-27 14:30 0export LD_LIBRARY_PATH=LD_LIBR ... -
dmlc分布式线性模型编译笔记
2018-06-06 10:37 21781、使用第三方修改后的wormhole工程 原始工程wor ... -
C++中读取控制台输出,并将文件指针FILE*转换为istream
2017-11-27 15:03 1842解决的问题: 1、通过执行系统的bash命令后,获取其输出( ... -
c++中使用boost库在共享内存中存储map
2017-11-09 11:37 5429boost库中的interprocess包可以在共享内存中创建 ... -
近似最近邻算法库FLANN
2017-04-25 18:45 0FLANN库是计算近似最近邻的库, 问题定义如下: 给定距离函 ... -
C++杂记-- 重定向std::cout等
2017-04-18 17:28 19721、屏蔽std::cout 参见:http://stackov ... -
CMake指定目标代码的平台(win32,x64)
2016-06-03 20:54 11729主要参考自:http://blog.c ... -
windows 10下安装GPU版MXNet
2016-06-03 21:28 8591上回说到编译CPU版的MXNet: http://cheris ... -
windows下安装CPU版mxnet
2016-05-23 23:14 17597MXnet (mix net)类似Caffe,Tensorfl ... -
Linux C++编译及 静态/动态 链接库 笔记
2015-12-20 19:49 60561、C++文件的编译 g++参 ... -
Linux (Ubuntu) 下 Eclipse C++ 环境配置
2015-12-08 21:49 19601、安装JDK 参见http://blog.csdn.net/ ... -
Photoshop插件开发-filter
2015-10-11 22:53 3374初学,,感觉PS插件的文档很烂,,教程也很少,,也就这么简单学 ... -
使Visual Assist X支持CUDA的.cu文件的代码提示
2015-07-17 00:05 2305现在安装CUDA很方便了,直接支持Visual Studio。 ... -
CUDA程序block和thread超出硬件允许值时的异常
2015-07-13 11:32 3755调用CUDA的核函数时指定block 和 thread大小,该 ... -
创建及使用DLL
2014-09-29 15:22 1233此篇仅作简要的记录,作为备忘。 更为详细的可以参考:http: ... -
matlab的mexFunction中使用std::cout(部分转载)
2014-09-27 15:37 2164在matlab、C++混合编程的时候,可能会用到之前的代码。代 ... -
Eigen库:那些年我们一起经历的bug
2014-09-24 18:39 18631、使用auto声明新变量 ... -
C++:无虚函数的类作为有虚函数类的父类时产生Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
2014-09-24 09:48 2005调程序时忘了为啥,写了一小段测试程序,再简单不过,结果跑出了E ...
相关推荐
- **偏锋技巧**: 包括Friend Name Injection、Curiously Recurring Template Pattern (CRTP)、Template Template Parameters (TTPs)、Member Templates等。 - **特殊设计**: 如Tuple、Traits Templates、Expression ...
- **第11章**:CRTP(Curiously Recurring Template Pattern),深入理解这种高级模板技巧。 - **第四篇**:模板的实际应用。 - **第12章**:容器设计,展示如何使用模板实现高效容器。 - **第13章**:算法模板,...
- **灵活性**:支持多种编程模式和技术,如策略模式、CRTP(Curiously Recurring Template Pattern)等。 - **性能优势**:通过利用Template元编程的优势,在不牺牲运行时性能的前提下实现了代码的灵活性和扩展性。 ...
库可能使用了虚函数表(vtable)或CRTP(Curiously Recurring Template Pattern)等技术来实现对C++类成员的调用。同时,为了在lua中访问和修改对象的成员变量,可能利用了lua_setfield和lua_getfield等API。 对于...
- **Curiously Recurring Template Pattern (CRTP)**:一种设计模式,利用模板参数来表达继承关系,常用于编译时优化和类型安全的自我引用。 - **Template Template Parameters**:允许将模板作为模板参数传递,提供...
作者在书中提及了一些重要的编程概念,如Curiously Recurring Template Pattern(好奇递归模板模式)、Mixin继承、以及属性(Properties)等,这些都是C++编程中的高级特性。同时,书中也讲述了设计原则,特别是...
- **好奇重复模板模式(Curiously Recurring Template Pattern, CRTP)**:一种特殊的设计模式,其中基类依赖于派生类。 - **模板模板参数(Template Template Parameters)**:允许模板接受另一个模板作为参数。 - **...
4. **CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)**:这是一种模板技巧,可以用来创建接口。一个模板类T作为另一个类B的基类,B的实例实际上是T的实例,这样B就可以强制实现T所要求的接口。 5...
- 虽然模板不直接支持多态(如虚函数那样),但它可以通过模板和继承结合实现类似的效果,如CRTP(Curiously Recurring Template Pattern)。 9. **模板与性能**: - 使用模板可以提高代码效率,但过度使用可能...
为了实现"属性注册",可以使用一种叫做元编程的技术,例如使用模板和CRTP(Curiously Recurring Template Pattern,奇异递归模板模式)来创建一个属性系统。每个类可以继承一个属性基类,该基类包含注册属性的方法。...
2. **Curiously Recurring Template Pattern(好奇的重复模板模式)**:这是一种设计模式,允许类继承自自身的一个模板实例,从而实现自我引用的行为。 3. **Template Template Parameters(模板模板参数)**:这是...
6. **模板和继承的结合**:通过模板和继承的巧妙结合,可以实现更灵活的设计模式,如CRTP(Curiously Recurring Template Pattern)。 这些书籍深入讲解了C++的许多核心概念和最佳实践,对于任何想要提升C++技能的...
为了处理这些问题,可能需要更复杂的元编程技术,如使用CRTP(Curiously Recurring Template Pattern)和成员函数指针,甚至考虑使用第三方库如Boost.Fusion或Modern C++ Reflection(C++20的实验性特性)。...
通常,STL的源码会展示如何使用模板元编程和设计模式来构建高度通用的组件,比如使用CRTP(Curiously Recurring Template Pattern)实现迭代器的基类。 在实际开发中,结合STL的使用,我们可以编写出更加优雅和高效...
在性能敏感的代码中,可以考虑使用非虚函数和CRTP(Curiously Recurring Template Pattern)来实现静态多态。 8. **内存对齐与数据结构布局**:理解数据成员的内存对齐规则,优化数据结构布局,可以减少内存访问的...