一种编写回调函数的简单方法
繁琐的重复性工作
在之前的一篇文章中,我们讨论了这样一个主题:如果回调函数是一个类的成员函数,则这个回调函数必须被声明为静态的。
编写一个静态的回调函数,其实并不复杂,但是还是比较繁琐,下图中展示了一个正儿八经的回调函数定义:
在这个类中,它有一个线程过程函数,这个函数必须具有正确的函数原型,然后为了能够在线程过程函数中访问到类对象,你需要将一个对象指针作为线程的参数传递进去。
的确,我们每次编写这样的线程过程函数时,都可以这样手动的编写重复的代码,但是,如果我们使用一种更加精巧的手法来编写这个回调函数,则我们可以轻松地应对诸如此类的重复应用场景,并能顺利地访问到这个”this”指针,听起来还挺有意思的,对吧?
如何改进我们的代码?
可以使用下面的模板代码来对这个线程过程函数进行抽象化,如下图所示:
这个模板代码声明了一个模板化的线程过程函数。请注意,我们这里使用了正确的调用约定CALLBACK来声明这个模板函数,所以,它可以直接传递给CreateThread函数。
接下来,我们的类代码就可以简化到下面的版本,请看:
通过对代码进行模板化改造,我们将之前版本中的回调函数定义从类中隐藏起来,实际上该回调函数由编译器自动从模板中生成出来。这样,我们就可以将注意力集中在逻辑功能上,而不用花时间在琐碎的重复编码上,是不是感觉轻松了一些呢?
总结
通过合理使用模板这个技术,可以将重复性的代码交给编译器来做,从而将宝贵的时间用在系统核心功能的构建上。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Wrapper templates to make writing callback functions slightly easier》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关文章
- 从函数中返回多个值的方法
- 第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性
- 用Python计算三角函数之acos()方法的使用
- 通过重写虚方法实现加法运算
- numpy的使用方法
- Excel VLOOKUP函数的使用方法
- python使用threading获取线程函数返回值的实现方法
- python用reduce和map把字符串转为数字的方法
- Array对象的方法实现(6)----Array.prototype.indexOf(实现常规参数的功能)
- Spring管理的bean初始化方法的三种方式,以及@PostConstruct不起作用的原因
- Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法、如何查询某个函数&关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略
- Database之SQL:SQL之over partition by开窗函数的简介、使用方法(求各班级内各自排名/求各班级内第一名/求各班级内分数递增和等案例解析)之详细攻略
- MAT之SA:T1编写主函数法和T2Matlab自带的SA工具箱GUI法,两种方法实现对一元函数优化求解
- Python语言学习之lambda:lambda函数的简介、使用方法、案例大全之详细攻略
- Py之GUI之PyQt:成功解决PyQt4升级到PyQt5改变的函数或方法
- Python语言学习:三种随机函数random.seed()、numpy.random.seed()、set_random_seed()及random_normal的简介、使用方法(固定种子)详细攻略
- JSP和Servlet的六种中文乱码处理方法
- Android 秒转换成时分秒的方法
- Qt 日志处理方法(qInstallMsgHandler函数)简单实用
- WEB漏洞攻防 - 文件上传漏洞 - 白名单的绕过处理方法
- 【Copula】基于二元Frank-Copula函数的风光出力场景生成方法【考虑风光出力的不确定性和相关性】(Matlab代码实现)
- 【Go基础】包、变量、函数、流程控制语句、结构体和方法
- 非常不错的train方法模板
- vue的iview列表table render函数设置DOM属性值的方法
- C++ 排序函数 sort(),qsort()的使用方法
- Promise - (五)then方法参数回调函数加入异步微任务队列的时机
- Java建立计算高斯函数的计算机方法
- Euler方法和改进的Euler方法
- 基于交替方向乘法(ADMM)的PAPR约束下传输波束成形器设计的方法研究(Matlab代码实现)
- satellite.js库下载、介绍、安装、引用,返回函数的方法