文档章节

[C/C++]完整揭秘VS2010关于function和bind的实现

梁欢
 梁欢
发布于 2013/10/25 22:16
字数 1125
阅读 1397
收藏 16
很久之前我就对C++里面的function非常感兴趣,也探究出了一些成果。
这两篇文章是对VS2010中如何实现function和bind的代码追查,最终得出了一个function继承体系结构图。
这篇文章以上面得出的结构图为指导,最终破解了function的真实继承体系(精简版本)。但是却也留下了一个问题没有解决——我最终给出的是一个二元参数的版本,并没有如实际的function那般使用起来得心应手。
我决定继续向这个问题宣战!——
最后我胜利了。今天我就是带着这份胜利的喜悦和大家分享到底这个function是怎么实现的。这次不是原模原样的解释function的实现代码,而是重新制作了一份精简版的function。
————————————————————————————————————————————
function的实现原理和  [C/C++再探讨STL里的function和bind的实现  中讲的一样,具体的大家可以回去温故一下。我只讲以前没有讲过的。

上面这篇文章中提到了怎么去使用宏来扩充模板参数,但是仅限于模仿,并没有理解其中的要义。我一点一点的顺序介绍吧。

function基类的模板参数应该是<class _TResult, class _T0, ... class _T2>、<class _TResult, class _T0, ... class _T9>这种样式的,这是毫无疑问的。这样才能组成_ResultType(_T0, _T1, _T2)、_ResultType(_T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)这样的函数指针。上面的参数形式针对的是普通形式的函数指针,对于类的成员函数指针我们需要<class _TResult, class _ClassType, class _T0, ... class _T2>、<class _TResult, class _ClassType, class _T0, ... class _T9>这样的参数列表以构成_ResultType(_ClassType::*)(_T0, _T1, _T2)、_ResultType(_ClassType::*)(_T0, _T1, _T2, _T3, _T4, _T5, _T6, _T7, _T8, _T9)这样的类成员函数指针。

宏——绝对是C/C++世界里面最奇妙的东西之一,通过宏你能够实现出大量的重复代码。而根据我在[C/C++再探讨STL里的function和bind的实现  里面讲到的 FunctionBase、FunctionOfMem、 FunctionOfPtr 、 Functor 在实现一元到十元的模板类的过程中,除却参数个数的不同,基本的代码结构没有任何变化。既然如此,我先想办法如何生成FunctionBase0 ... FunctionBase10、 FunctionOfMem0  ...  FunctionOfMem10、  FunctionOfPtr0  ...  FunctionOfPtr10、  Functor0 ...  Functor10这些模板类。而既然这些模板类仅仅是差在参数个数上,我想有必要先把模板参数的各个单元分解出来,如下(完整板的请看代码):

// 模板参数(右侧)列表 	class _T0 , class _T1 , class _T2
#define TmplArgList3	TmplArgList2 , TmplArgType(2)

// 模板参数(完整)列表 	class _ResultType , class _T0 , class _T1 , class _T2
#define TemplList3	TemplList2 , TmplArgType(2)

// 函数参数		_T2 arg2
#define TmplArgT3	TmplArg(2) TmplArgV(2)

// 函数参数列表		_T0 arg0 , _T1 arg1 , _T2 arg2
#define TmplArgTList3	TmplArgTList2 , TmplArgT3

// 模板参数变量		_T2
#define TmplArgOT3	TmplArg(2)

// 模板参数变量列表	_T0 , _T1 , _T2
#define TmplArgOTList3	TmplArgOTList2 , TmplArgOT3

// 函数参数变量		arg2
#define TmplArgOV3	TmplArgV(2)

// 函数参数变量列表	arg0 , arg1 , arg2
#define TmplArgOVList3	TmplArgOVList2 , TmplArgOV3

// 函数指针		_ResultType(_T0, _T1, _T2)
#define TmplFuncPtr3	TmplResult(TmplArgOTList3)





// 模板参数(右侧)列表 	class _T0 , class _T1 , class _T2 , class _T3
#define TmplArgList4	TmplArgList3 , TmplArgType(3)

// 模板参数(完整)列表 	class _ResultType , class _T0 , class _T1 , class _T2 , class _T3
#define TemplList4	TemplList3 , TmplArgType(3)

// 函数参数		_T3 arg3
#define TmplArgT4	TmplArg(3) TmplArgV(3)

// 函数参数列表		_T0 arg0 , _T1 arg1 , _T2 arg2 , _T3 arg3
#define TmplArgTList4	TmplArgTList3 , TmplArgT4

// 模板参数变量		_T3
#define TmplArgOT4	TmplArg(3)

// 模板参数变量列表	_T0 , _T1 , _T2 , _T3
#define TmplArgOTList4	TmplArgOTList3 , TmplArgOT4

// 函数参数变量		arg3
#define TmplArgOV4	TmplArgV(3)

// 函数参数变量列表	arg0 , arg1 , arg2 , arg3
#define TmplArgOVList4	TmplArgOVList3 , TmplArgOV4

// 函数指针		_ResultType(_T0, _T1, _T2, _T3)
#define TmplFuncPtr4	TmplResult(TmplArgOTList4)
我在TmplArgDef0.h文件中定义了模板参数从1—10的宏。大家可以看到其实从参数为2开始后面的宏模样基本一样,为了理解简单我就没有在做处理——因为既然有重复代码,那么肯定可以通过宏减少可见的代码。

——————————————————————————————————————————————
写不下去了,我先把代码上传上去,各位自己下载回去慢慢研究吧,又不懂的可以发邮件给我,我的邮件地址是lvan100@yeah.net。也可以通过QQ联系我,840078322。

C++中function和bind是如何实现的

本文转载自:

梁欢
粉丝 3
博文 19
码字总数 0
作品 4
海淀
高级程序员
私信 提问
vs2010新建MFC工程直接编译失败

1>------ Rebuild All started: Project: wqwq, Configuration: Debug Win32 ------ 1>Build started 2014/4/13 13:13:22. 1>_PrepareForClean: 1> Deleting file "Debug\wqwq.lastbuildstat......

MEngm
2014/04/13
1K
2
菜鸟之驱动开发10

在第10节里,我们要写一个ssdt hook功能的应用程序,因为是应用程序没有SSDT HOOK的能力,所以我们要写一个具有HOOK能力的驱动,然后应用程序发命令到驱动完成功能。 其实是以前学习的总结:...

长平狐
2012/08/13
54
0
VS2010/MFC编程入门教程之目录和总结(鸡啄米)

鸡啄米的这套VS2010/MFC编程入门教程到此就全部完成了,虽然有些内容还未涉及到,但帮助大家进行VS2010/MFC的入门学习业已足够。以此教程的知识为基础,学习VS2010/MFC较为深入的内容已非难事...

weixin_40647819
2018/05/23
0
0
JNI实现JAVA调用C/C++开源库

一、前言 JNI(Java Native Interface)的作用是实现java调用C/C++写的方法或开源库。由于java语言自身的局限性,一些特定功能的开源库往往是没有java语言版本的,比如本人项目中需要用到DSP库...

国之利刃2013
2017/08/01
0
0
菜鸟之驱动开发5

在前面4节中,我们学习了一个驱动的基本写法,也算是驱动已入门了。今天要介绍的就是在应用层加载与卸载驱动,有两种方法:1.修改注册表,2.用SCM-Service Control Manager管理驱动。我们今天...

长平狐
2012/08/13
108
0

没有更多内容

加载失败,请刷新页面

加载更多

 介绍一款优秀的通用管理权限快速开发框架

这是一套以权限管理为主的轻量化快速开发框架,配置有流程、专业表单、权限、app、企业微信等基础功能模块,在开发通用软件的效率上很有优势。 软件平台常用研发需求分析 《那些年我们一起做...

我想造火箭
18分钟前
6
0
ElasticDL:蚂蚁金服开源基于 TensorFlow 的弹性分布式深度学习系统

9 月 11 日,蚂蚁金服在2019谷歌开发者大会上海站上开源了 ElasticDL 项目,这是业界首个基于 TensorFlow 实现弹性深度学习的开源系统。 开源地址为:https://github.com/sql-machine-learni...

SOFAStack
26分钟前
4
0
CSS--渐变

一、什么是渐变 多种颜色平缓变化的一种显示效果 二、渐变的主要元素 色标:一种颜色,以及出现的位置,一个渐变至少两种色标 三、渐变的分类 1、线性渐变 以直线的方式来填充渐变色 2、径向...

wytao1995
41分钟前
5
0
Java通过模板生成PDF再转换为图片

1、添加maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13.1</version></dependency><dependency> <g......

醉美閑聖
47分钟前
3
0
SpringBoot-MVC RequestBody中LocalDateTime的自适应配置

请求的json报文中可能会出现 一下几种: ['2019-01-01','2019-01-01 12:03:34','20190101120334'] 但是接收的Request实体类日期字段是LocalDateTime类型 LocalDateTime applyDate; 希望的情况......

汉堡OSC
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部