zl程序教程

您现在的位置是:首页 >  后端

当前栏目

一种编写回调函数的简单方法

方法 函数 简单 编写 一种 回调
2023-09-14 09:10:44 时间

繁琐的重复性工作

在之前的一篇文章中,我们讨论了这样一个主题:如果回调函数是一个类的成员函数,则这个回调函数必须被声明为静态的。
编写一个静态的回调函数,其实并不复杂,但是还是比较繁琐,下图中展示了一个正儿八经的回调函数定义:

在这个类中,它有一个线程过程函数,这个函数必须具有正确的函数原型,然后为了能够在线程过程函数中访问到类对象,你需要将一个对象指针作为线程的参数传递进去。

的确,我们每次编写这样的线程过程函数时,都可以这样手动的编写重复的代码,但是,如果我们使用一种更加精巧的手法来编写这个回调函数,则我们可以轻松地应对诸如此类的重复应用场景,并能顺利地访问到这个”this”指针,听起来还挺有意思的,对吧?

如何改进我们的代码?

可以使用下面的模板代码来对这个线程过程函数进行抽象化,如下图所示:

这个模板代码声明了一个模板化的线程过程函数。请注意,我们这里使用了正确的调用约定CALLBACK来声明这个模板函数,所以,它可以直接传递给CreateThread函数。
接下来,我们的类代码就可以简化到下面的版本,请看:

通过对代码进行模板化改造,我们将之前版本中的回调函数定义从类中隐藏起来,实际上该回调函数由编译器自动从模板中生成出来。这样,我们就可以将注意力集中在逻辑功能上,而不用花时间在琐碎的重复编码上,是不是感觉轻松了一些呢?

总结

通过合理使用模板这个技术,可以将重复性的代码交给编译器来做,从而将宝贵的时间用在系统核心功能的构建上。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Wrapper templates to make writing callback functions slightly easier》

最近我写了个东西

正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。