执行一个类属回调调度器

ZDNet软件频道 时间:2003-10-28 作者:zdnet china |  我要评论()
本文关键词:cpptips
事件驱动程序以及基于菜单的程序,都广泛使用了回调。在某些情况下,建立一个类属回调调度器是非常有好处的,这一调度器可以启动任何一个类的成员函数.
本文译自Builder.com,未经许可请勿转载 事件驱动程序,比如

<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年的专业经验。




责任编辑:炒饭

欢迎评论投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134