1 回调函数
1.1 适用范围
假设你要设计一个模块,这个模块通过回调的方式与外部其他模块交互,注册回调的接口可能会像下面这样:
Class xyz
{
Void RegisterCallback(void(*)(int));
};
如果这样就能让你满足的话,请你关了这篇文档,喝杯咖啡或者看看电影消遣一下,以免消耗过多的脑细胞。
如果能把类的成员函数作为回调的话会得到很多便利,至少你可以少些很多的代码来实现静态函数和你的外部类之间的交互。这样会带来一个问题,对于每一个需要被通知的类都要有一个注册的接口:
Void RegisterCallback(classX *pc,void(classX::*)(int));
这样做再次违反了设计的美学。是否有方法提供一个统一的接口,而不管回调函数是静态函数或任意类的成员函数呢?答案是肯定的。
1.2 使用方法
模块1中代码:
Void test1(int)
Struct xyz
{
Int Menberfunc(int);
};
Xyz *p = new xyz;
CCallbackFunc *p1 = CreateCallback(test1);
CCallbackFunc *p2 = CreateCallback(p,&Xyz ::Menberfunc);
现在只要你的模块保存p1和p2就可以用如下的方式调用回调:
ExcuteCallback(P1,33);
ExcuteCallback(P2,55);
甚至还可以这么写:
CCallbackFunc *p1 = CreateCallback(test1,99);
以后的某个时间:
ExcuteCallback(p1)