65.9K
CodeProject 正在变化。 阅读更多。
Home

仿函数作为事件引擎

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.25/5 (17投票s)

2005年3月8日

2分钟阅读

viewsIcon

80999

downloadIcon

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 - 绑定 functor

operator =() - 绑定 functor

Call - 存储参数

DeferredCall - 使用存储的参数调用绑定的 functor

IsCalled() - 如果已进行 Call 但尚未进行 DeferredCall,则返回 true

DeferredCallSaveResult() - 保存调用的结果

GetResult() - 返回 DeferredCallSaveResult 保存的结果

SetOnCall() - 允许设置将在 Call 期间调用的 functor

CRemoteFunctor - 与 CDeferredFunctor 相同,但将参数存储在 IStream 中。方法

constructor - 绑定 functor

Call - 存储参数

RemoteCall - 使用存储的参数调用绑定的 functor

GetData(IStream * pStream) - 将内部流复制到给定流

SetData(IStream * pStream, bool bRewind=true) - 将给定流复制到内部流,可选地在复制之前将给定流设置为开始位置

SetOnCall - 允许设置将在 Call 期间调用的 functor

© . All rights reserved.