WEB开发网
开发学院软件开发VC 事件编程(二) 阅读

事件编程(二)

 2007-03-15 21:54:00 来源:WEB开发网   
核心提示: 既然通知函数在本文中是一种实验模型,那么自然会问这样的问题:它们有没有某种通用的实现方法?我能将整个事件机制封装到单个的类、模板或宏,事件编程(二)(2),或者任何事件源能使用的其它什么类型中吗?答案是肯定中的肯定,我将示范如何创建一个使用宏和模板的事件系统,并对每个元素调用函数对象 No

既然通知函数在本文中是一种实验模型,那么自然会问这样的问题:它们有没有某种通用的实现方法?我能将整个事件机制封装到单个的类、模板或宏,或者任何事件源能使用的其它什么类型中吗?答案是肯定中的肯定。我将示范如何创建一个使用宏和模板的事件系统,以便将事件处理的代码量降至最低限度。我们的旅程需要借助一些高境界的 C++ 操作,比如嵌套模板以及仿函数类(functor class)。

我将分几个步骤实现这个系统。目的是编写一个实现通知函数 NotifyProgress 以及 NotifyDone 的模板。每个函数都具备相似而又不完全一样的模型:// NotifyFoo — raise Foo event
list<IPrimeEvents*>::iterator it;
for (it=m_clients.begin(); it!=m_clients.end(); it++) {
 (*it)->OnFoo(/*args*/);
}    
  也就是说迭代客户机列表,并针对每个客户机调用 OnFoo,传递事件参数。如何把它写成一个模板呢?可以将接口 IPrimeEvents 参数化为一个类型 T,但如何参数化事件处理函数 OnFoo,程序员可能选择的任何名字和签名。

任何时候你参数化某个函数时,都应该考虑:仿函数,也叫做 functor。仿函数是 C++ 语言中将函数转换为类的一种机制,它代替了给回调函数传递指针的做法,而是传递仿函数类的实例。在标准模板库 STL 中包含有丰富的 Functor,并实现了一些使用 functor 的算法,尤其是 for_each 算法,在本文中很有用:for_each(m_clients.begin(), m_clients.end(),
NotifyProgress(nFound));

for_each 算法从头到尾迭代容器元素,并对每个元素调用函数对象 NotifyProgress。这里说的“函数对象”到底是指的什么呢?不是一个函数,它是一个对象。这个类看起来像下面这个样子:

上一页  1 2 3 4 5 6  下一页

Tags:事件 编程

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接