仿函数作为事件引擎






2.25/5 (17投票s)
2005年3月8日
2分钟阅读

80999

272
Functor 实现。事件机制创建。
引言
Functor 实现
Functor 是函数的包装器。它对于统一静态函数和成员函数调用很有用。此外,它对于创建事件机制很有益处。
下面表示的语法仅适用于 MSVC++ 7.1,此文件也包含 6.0 的定义,但使用它们您可能不会感到满意。
Using
IFunctor - 所有 functor 的公共接口。它有几个函数
Call()
- 调用绑定的函数,
operator ()
- 调用 Call
IsEqual(IFunctor *)
- 如果两个 functor 都与相同的函数绑定,则返回 true。高级
IFunctor 继承自 IRefCounted
IRefCounted 具有以下方法
AddRef()
- 增加引用计数器
Release()
- 减少引用计数器,并在引用计数为零时删除对象。
DecreaseRef()
- 减少引用计数器而不删除
GetFunctor
() - 重载函数,用于创建 functor,返回 IFunctor
GetFunctor(StaticFunction)
- 创建静态 functor
GetFunctor(&obj/*CMyObj */, CMyObj::Function)
- 创建成员 functor
GetFunctor(pFunctor/*IFunctor* */)
- 创建成员 functor高级
GetFunctor 返回指向 IFunctor 的指针,该指针具有零引用计数。 因此,AddRef 然后 Release 将释放已分配的内存。
CFunctorSet
- IFunctor* 的容器。 也从 IFunctor 派生,具有以下方法
operator +=(IFunctor*)
- 追加 functor
operator -=(IFunctor*)
- 删除 functor(不仅仅是指针相等时:它在 functor 上使用 IsEqual)
Call
- 调用所有 functor
operator ()
-调用 Call高级
operator +=()
在给定的 functor 指针上调用 AddRef
operator -=()
在给定的 functor 指针上调用 Release因此,虽然 GetFunctor 分配内存,但 CFunctorSet 会释放它。
因此,在不同的情况下,您必须首先 AddRef,然后在所有操作之后 Release GetFunctor 返回的指针。
示例
CFunctorSet<void (*)(int)> m_vMyEvent;
void MyStaticFn(int){}
class CMyClass{ public: void MyMemFn(int){} };
m_vMyEvent+=GetFunctor(MyStaticFn); CMyClass obj; m_vMyEvent+=GetFunctor(&obj, CMyClass::MyMemFn); m_vMyEvent(1); //calls both functions m_vMyEvent-=GetFunctor(MyStaticFn); //it works 'cause operator -=() uses IsEqual m_vMyEvent(2); //calls only member function of CMyClass obj.
高级
CDeferredFunctor
- 用于跨线程通信中的延迟调用。方法
constructor
- 绑定 functoroperator =() - 绑定 functor
Call
- 存储参数DeferredCall - 使用存储的参数调用绑定的 functor
IsCalled()
- 如果已进行 Call 但尚未进行 DeferredCall,则返回 true
DeferredCallSaveResult()
- 保存调用的结果
GetResult()
- 返回 DeferredCallSaveResult 保存的结果
SetOnCall()
- 允许设置将在 Call 期间调用的 functorCRemoteFunctor - 与 CDeferredFunctor 相同,但将参数存储在 IStream 中。方法
constructor
- 绑定 functor
Call
- 存储参数
RemoteCall
- 使用存储的参数调用绑定的 functor
GetData(IStream * pStream)
- 将内部流复制到给定流
SetData(IStream * pStream, bool bRewind=true)
- 将给定流复制到内部流,可选地在复制之前将给定流设置为开始位置
SetOnCall
- 允许设置将在 Call 期间调用的 functor