C#的委托机制的C++的一种实现DIY版
2009-10-19 16:21
796 查看
以下是C#的委托机制的的一个例子,不过只能支持非成员函数版
如果DDoEvent方法的返回值是空的情况下,无法通过编译,所以我又加了一个特化版的
下一个版本是成员函数版,其实只是封装了一下回调函数而已。
但是缺陷就是只实现一个函数的通知,不能实现跨类不同方法的通知
其实以上三个都没有做到C#的委托机制(跨类的成员函数全部响应)。
用模板实现C#的委托机制感觉对于目前的我来说还是太难了。
于是转了一帖:(转)C#的委托机制的C++的一种实现。
代码非常简练,保存了函数指针的类型和成员函数的地址
其核心代码是用汇编来实现调用。
收藏并学习之。
地址:http://blog.csdn.net/Last_Impression/archive/2009/10/19/4698948.aspx
#include <list> ////////////////////////////////////////////////////////////////////////// //R 返回值 //T 参数 ////////////////////////////////////////////////////////////////////////// template< typename R, typename T> class Delegate { public: //回调函数的名字 typedef R (__stdcall *RT)(T); public: Delegate<R,T>(RT r) { m_list.clear(); m_list.push_back(r); }; inline Delegate<R,T>* operator+=(const RT p) { m_list.push_back(p); return this; }; inline Delegate<R,T>* operator-=(const RT p) { m_list.remove(p); return this; }; R DDoEvent(T t) { if (m_list.empty()) { return NULL; } std::list<RT>::iterator iter = m_list.begin(); while (iter != m_list.end()) { R r = (*iter)(t); iter++; } return r; }; private: std::list<RT> m_list; };
如果DDoEvent方法的返回值是空的情况下,无法通过编译,所以我又加了一个特化版的
//void偏特化 template<typename T> class Delegate<void, T> { public: typedef void (__stdcall *RT)(T); public: Delegate<void, T>(RT r) { m_list.clear(); m_list.push_back(r); }; Delegate<void, T>* operator+=(const RT p) { m_list.push_back(p); return this; }; Delegate<void, T>* operator-=(const RT p) { m_list.remove(p); return this; }; void DDoEvent(T p) { if (m_list.empty()) { return NULL; } std::list<RT>::iterator iter = m_list.begin(); while (iter != m_list.end()) { (*iter)(p); iter++; } }; private: std::list<RT> m_list; };
下一个版本是成员函数版,其实只是封装了一下回调函数而已。
但是缺陷就是只实现一个函数的通知,不能实现跨类不同方法的通知
template<typename BaseClass,typename T, typename R> class NewDelegate { public: // Constructor takes the values and stores them NewDelegate(T *pObj, R (BaseClass::*pFunc)(T)) { m_pObject = pObj; m_pFunction = pFunc; } // Invokes the stored function R operator()(T p) { return (m_pObject->*m_pFunction)(p); } private: BaseClass *m_pObject; // Pointer to the object R (BaseClass::* m_pFunction)(T); // Pointer to the function };
其实以上三个都没有做到C#的委托机制(跨类的成员函数全部响应)。
用模板实现C#的委托机制感觉对于目前的我来说还是太难了。
于是转了一帖:(转)C#的委托机制的C++的一种实现。
代码非常简练,保存了函数指针的类型和成员函数的地址
其核心代码是用汇编来实现调用。
收藏并学习之。
地址:http://blog.csdn.net/Last_Impression/archive/2009/10/19/4698948.aspx
相关文章推荐
- (转)C#的委托机制的C++的一种实现
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
- C++实现委托机制(一)
- 用 C++ 实现 C# 中的 委托/事件 (5-functor2)
- 用C++实现C#中的委托/事件(标准C++之升级版)
- C++实现委托机制(二)
- C++实现的委托机制(一)
- C++实现委托机制之完整代码实现(一)
- C++实现的委托机制(三)
- 在C++中实现C#的委托
- 用C++实现C#中的委托和事件
- C++实现的委托机制(二)
- 用 C++ 实现 C# 中的 委托/事件 (1-delegateEMU.cpp)
- C++实现的委托机制(1)
- C++实现委托机制(三)——lambda表达式封装
- 实现C++中的事件委托机制
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
- C++实现的委托机制(2)
- C++插件机制的一种实现方法(对象工厂)
- 转载 C++实现的委托机制