蓝天,小湖,湖水中一方小筑

说说回调

最近做个项目,在设计的时候想到有可能要用到回调,对于这个东西已经弄不懂很久了,于是就上网找资料看,经过一个程序的磨炼后,差不多弄懂了,说说吧。

默认情况下,函数调用的过程是这样的:程序中某懒人A想做件事,但是不想自己去做,于是用了个时髦的方法,外包给B(函数调用),然后B辛辛苦苦的把事情做完后,把结 果再恭恭敬敬的送给(return)一直在那等着(阻塞调用)的A,然后A把剩下的钱给B,两清了。经过了这次事情,这两人就有了业务上的联系,A经常把事情外包给B ,B也经常从A那拿到钱,皆大欢喜。但是突然有一天,A扔给了B一个任务,与往常不同的是,A还扔给了B一个联系方式,上面写着怎么去找C(函数的地址)。原来A发现 这个活有些地方B不一定做的好,而C可以做好,为了不让B自己在那瞎折腾,顺便把C的地址也给了他。后面的嘛,自然,B在C的帮助下做好了这件事,按时完工。
差不多就是这样,调用者A在传给B的参数中加上了一个指向函数的指针C,在B中要调用C来完成工作。想看例子的话,可以去看STL中的qsort,它的最后一个参数就 是一个函数指针,要利用传递进去的函数来做比较,进行排序。从网上找一段:

函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较 的是何类数据–整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个 比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以 全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。

回调函数的作用差不多弄明白了,下面就要开始写了。刚啃回调的时候看不懂,请教了身边的几个人,清一色告诉我说回调是Windos下的,要用WinAPI,当时那叫一 个郁闷啊。后来仔细一下,不对,于是开始满世界的google,最后终于被我找到了一个例子,拿来,看差不多明白了,自己随便改了一下,发上来吧

**19 ****#include ****<string>**  

**20 ****#include ****<iostream>**  

**21 ****#include ****<boost/function.hpp>**  

**22 **  

**23 ****using** **namespace** std;  

**24 ****using** **namespace** boost;  

**25 **  

**26 ****static** **void** foo()  

**27 **{  

**28 **    cout << **"Hello World"** << endl;  

**29 **}  

**30 **  

**31 ****static** **void** bar(**int** f_times, boost::function<**void** ()> f_fun)  

**32 **{  

**33 **    **for** (**int** i = **0**; i < f_times; i++)  

**34 **    {  

**35 **        f_fun();  

**36 **    }  

**37 **}  

**38 **  

**39 ****int** main()  

**40 **{  

**41 **    bar(**10**, foo);  

**42 **    **return** **0**;  

**43 **}  

前面的注释没弄上来,foo函数是我自己定义的一个函数,而bar就是传说中的回调函数,传递给它的参数中有一个函数指针,用的是boost库的东西,然后bar在执 行的过程中调用foo,看上去应该还算清楚。

都是自己琢磨的东西,希望木有错。