(转)C#的委托机制的C++的一种实现
2009-10-19 16:11
781 查看
一直以来总觉的C#的委托机制很好用。因为主要是做C++开发的。所以总是在想能不能在c++下实现下委托机制。先前也实现过几个版本。有的是通过传入对象指针和成员函数的指针的方式,有的是通过模板方式实现的。但这些实现都是在使用是显得很麻烦。要不写出的代码很臃肿。这和我一向的风格很不一致。研究了很久终于有了又一个更好的方案。不敢独享。让大家来指点一下。 代码如下: //Delegate.h头文件 #include <vector> struct MemberPointer { template <typename T> MemberPointer(T* pClass, LRESULT (T::*pfn)(WPARAM w, LPARAM l)):pThis(pClass),address(*((long*)&pfn)){} void operator()(WPARAM w, LPARAM l); MemberPointer& operator =(const MemberPointer& span); long address; LPVOID pThis; }; class Delegate { public: Delegate(void); virtual ~Delegate(void); Delegate& operator += (const MemberPointer& memberPointer); Delegate& operator -= (const MemberPointer& memberPointer); HRESULT operator()(WPARAM wParam, LPARAM lParam); private: std::vector<MemberPointer> m_vtAllDelegate; }; Delegates CPP文件 //------------------------------------------------------------------------------ void MemberPointer::operator()( WPARAM w, LPARAM l ) { const LPVOID pThis = this->pThis; long address = this->address; __asm { mov eax, l push eax mov eax, w push eax mov ecx, dword ptr[pThis] call address }; } //------------------------------------------------------------------------------ MemberPointer& MemberPointer::operator=( const MemberPointer& span ) { this->pThis = span.pThis; this->address = span.address; return *this; } //------------------------------------------------------------------------------ Delegate::Delegate( void ) { ; } //------------------------------------------------------------------------------ Delegate::~Delegate( void ) { m_vtAllDelegate.clear(); } //------------------------------------------------------------------------------ Delegate& Delegate::operator+=(const MemberPointer& memberPointer ) { m_vtAllDelegate.push_back(memberPointer); return *this; } //------------------------------------------------------------------------------ Delegate& Delegate::operator-=(const MemberPointer& memberPointer ) { for (std::vector<MemberPointer>::iterator it = m_vtAllDelegate.begin(); it!= m_vtAllDelegate.end() ; ++it) { MemberPointer& mp = (*it); if (mp.address == memberPointer.address && mp.pThis == memberPointer.pThis) { m_vtAllDelegate.erase(it); break; } } return *this; } //------------------------------------------------------------------------------ HRESULT Delegate::operator()( WPARAM wParam, LPARAM lParam ) { HRESULT hr = S_OK; for (UINT uCnt = 0; uCnt < m_vtAllDelegate.size(); ++uCnt) { m_vtAllDelegate[uCnt](wParam, lParam); } return hr; } 使用举例: class CTest { public: LRESULT OnDoSomething(WPARAM w, LPARAM l){return 0;} } 在某处要用到时 CTest aTest; Delegate doSomethingDelegate; doSomethingDelegate += MemberPointer(&aTest, &CTest::OnDClose); 调用 doSomethingDelegate(0xff, 0xff); |
相关文章推荐
- C#的委托机制的C++的一种实现DIY版
- C++ 0x 使用可变参数模板类 实现 C# 的委托机制
- C++实现委托机制(一)
- C++实现委托机制(一)
- C++实现委托机制(二)
- C++实现的委托机制(3)
- C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)
- C++实现的委托机制
- 用 C++ 实现 C# 中的 委托/事件 (2-delegate event functor)
- C++实现的委托机制(一)
- C#中用委托实现C++的回调函数
- C++实现委托机制之完整代码实现
- C++实现的委托机制(三)
- c++实现类似c#事件机制的链接
- 用 C++ 实现 C# 中的 委托/事件 (4-functor1)
- C++实现的委托机制(二)
- 转载 C++实现的委托机制
- C++实现的委托机制(三)
- 在C++中实现C#的委托
- C++实现事件委托机制