C++代理实现
2015-06-13 16:25
302 查看
//Delegate.h #include <list> using namespace std; class CDelegateBase { public: CDelegateBase(void *pObject, void *pFn) { m_pObject = pObject; m_pFn = pFn; } CDelegateBase(const CDelegateBase& rhs) { m_pObject = rhs.m_pObject; m_pFn = rhs.m_pFn; } virtual ~CDelegateBase(){}; bool Equals(const CDelegateBase& rhs) const { return m_pObject == rhs.m_pObject && m_pFn == rhs.m_pFn; } bool operator() (void *param) { return Invoke(param); } virtual CDelegateBase* Copy() = 0; protected: void *GetFn(){return m_pFn;} void *GetObject(){return m_pObject;} virtual bool Invoke(void *param) = 0; private: void *m_pObject; void *m_pFn; }; class CDelegateStatic: public CDelegateBase { typedef bool (*Fn)(void*); public: CDelegateStatic(Fn pFn) : CDelegateBase(NULL, pFn) { } CDelegateStatic(const CDelegateStatic& rhs) : CDelegateBase(rhs) { } virtual CDelegateBase* Copy() { return new CDelegateStatic(*this); } protected: virtual bool Invoke(void* param) { Fn pFn = (Fn)GetFn(); return (*pFn)(param); } }; template <class O, class T> class CDelegate : public CDelegateBase { typedef bool (T::* Fn)(void*); public: CDelegate(O* pObj, Fn pFn) : CDelegateBase(pObj, &pFn), m_pFn(pFn) { } CDelegate(const CDelegate& rhs) : CDelegateBase(rhs) { m_pFn = rhs.m_pFn; } virtual CDelegateBase* Copy() { return new CDelegate(*this); } protected: virtual bool Invoke(void* param) { O* pObject = (O*) GetObject(); return (pObject->*m_pFn)(param); } private: Fn m_pFn; }; template <class O, class T> CDelegate<O, T> MakeDelegate(O* pObject, bool (T::* pFn)(void*)) { return CDelegate<O, T>(pObject, pFn); } inline CDelegateStatic MakeDelegate(bool (*pFn)(void*)) { return CDelegateStatic(pFn); } class CEventSource { typedef bool (*FnType)(void*); public: ~CEventSource() { for(list<void *>::iterator iter = m_aDelegates.begin(); iter != m_aDelegates.end(); ++iter){ CDelegateBase* pObject = static_cast<CDelegateBase*>(*iter); if( pObject) delete pObject; } } operator bool() { return m_aDelegates.size()>0; } void operator+= (CDelegateBase& d) { for(list<void *>::iterator iter = m_aDelegates.begin(); iter != m_aDelegates.end(); ++iter){ CDelegateBase* pObject = static_cast<CDelegateBase*>(*iter); if( pObject && pObject->Equals(d) ) return; } m_aDelegates.push_back(d.Copy()); } void operator+= (FnType pFn) { (*this) += MakeDelegate(pFn); } void operator-= (CDelegateBase& d) { for(list<void *>::iterator iter = m_aDelegates.begin(); iter != m_aDelegates.end(); ++iter){ CDelegateBase* pObject = static_cast<CDelegateBase*>(*iter); if( pObject && pObject->Equals(d) ) { delete pObject; m_aDelegates.erase(iter); return; } } } void operator-= (FnType pFn) { (*this) -= MakeDelegate(pFn); } bool operator() (void* param) { for(list<void *>::iterator iter = m_aDelegates.begin(); iter != m_aDelegates.end(); ++iter){ CDelegateBase* pObject = static_cast<CDelegateBase*>(*iter); if( pObject && !(*pObject)(param) ) return false; } return true; } protected: list<void*> m_aDelegates; };
使用示例:
#include <stdio.h> #include "Delegate.h" bool test1(void *param) { printf("hello\n"); return true; } class ClsTest { public: bool test(void *param) { int a = *(int*)(param); printf("cls test %d\n", a); return false; } }; int main(void) { CEventSource event; event += test1; ClsTest cls; event += MakeDelegate(&cls, &ClsTest::test); int a = 8; event((void*)&a); event -= test1; event((void*)&a); getchar(); return 0; }
相关文章推荐
- C++学习笔记之---boolalpha
- C++中的工厂模式(★好文章firecat推荐★)
- C++学习笔记之---输出一个数的八进制,十进制,十六进制
- C++ 文件输入和输出fout fin
- C++ CTreeview的checkbox使用方法
- C++ 字符串分割方法 实现split
- 直方图均衡化(VC++)
- c++ 的参数解析方法: getopt
- 整数与浮点数的二进制表示方式 分类: C/C++ 2015-06-13 15:45 54人阅读 评论(0) 收藏
- C语言知识点2
- C++ Vector容器的实现
- 一起talk C栗子吧(第十四回:C语言实例--循环链表)
- C++解析一段以;分隔的字符串
- wsdl2h解析器和soapcpp2编译器选项介绍
- C++入门程序作业3
- C++ const总结
- C++ 中调用执行Python文件
- 《爱编程,爱c++十五期-publish,继承》
- C++ 根据当前路径与相对路径,获取绝对路径
- C++ 读取文件内容至当前文件长度的字符串中