说说回调
最近做个项目,在设计的时候想到有可能要用到回调,对于这个东西已经弄不懂很久了,于是就上网找资料看,经过一个程序的磨炼后,差不多弄懂了,说说吧。
默认情况下,函数调用的过程是这样的:程序中某懒人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,看上去应该还算清楚。
都是自己琢磨的东西,希望木有错。