<a href="http://ct.com.com/click?q=a8-020ZQQZgjuniLBwyvuP6wCzWsN~j" >,以及基于菜单的程序,都广泛使用了回调。在某些情况下,建立一个类属回调调度器是非常有好处的,这一调度器可以启动任何一个类的成员函数,只要它们具有相同的记号。
一个类属回调调度器可以作为一个类的模板而执行,而这一模板具有两个参数:被调用的成员函数的类和指向特定成员函数的一个指针。为了确保类属回调函数可以适用于任何一个类,可以将第二个参数和第一个参数联系起来,如下所示:
template <class T, void (T::*F)()>
class dispatcher ;
在调度器中,你可以将T&作为一个数据成员,一个构造函数,以及一个名为execute()的成员函数,这一成员函数可以调用回调成员函数:
template <class T, void (T::*F)()>
class dispatcher
{
private:
T& obj;
public:
dispatcher (T& t) : obj(t) {} // bind actual object to T
void execute() // invoke callback function
};
t是一个成员函数被调用的对象的一个引用。
为了清楚地知道调度器如何被作用,可以查看以下比较复杂的范例。假设你有一个名为B的类,类中有一个成员函数f():
class B
{
public:
void f() {std::cout <<"B::f()"<<std::endl;}
};
如果你想使用调度器来调用f()。第一,使用B建立一个调度器对象而作为第一个参数,将&B::f作为第二个参数。
int main()
{
B b;
dispatcher <B, &B::f> disp(b);// instantiate template
disp.execute(); //call callback member function
}
你可以使用任何类型的回调类模板,只要成员函数具有与模板参数相同的记号。
本文作者Danny Kalev 是一个系统分析家、软件工程师,在C++和面向对象设计方面有着14年的专业经验。