C++实现委托

来源:互联网 发布:c语言程序界面设计 编辑:程序博客网 时间:2024/05/24 07:09

一直以来总觉的C#的委托机制很好用。因为主要是做C++开发的。所以总是在想能不能在c++下实现下委托机制。先前也实现过几个版本。有的是通过传入对象指针和成员函数的指针的方式,有的是通过模板方式实现的。但这些实现都是在使用是显得很麻烦。要不写出的代码很臃肿。这和我一向的风格很不一致。研究了很久终于有了又一个更好的方案。不敢独享。让大家来指点一下。

代码如下:

[cpp] view plaincopy
  1. //Delegate.h头文件  
  2.   
  3. #include <vector>  
  4.   
  5. struct MemberPointer  
  6. {  
  7. template <typename T>  
  8. MemberPointer(T* pClass, LRESULT (T::*pfn)(WPARAM w, LPARAM l)):pThis(pClass),address(*((long*)&pfn)){}  
  9. void operator()(WPARAM w, LPARAM l);  
  10. MemberPointer& operator =(const MemberPointer& span);  
  11. long     address;  
  12. LPVOID     pThis;  
  13. };  
  14.   
  15.   
  16. class Delegate  
  17. {  
  18. public:  
  19.   
  20. Delegate(void);  
  21. virtual ~Delegate(void);  
  22.   
  23. Delegate& operator += (const MemberPointer& memberPointer);  
  24. Delegate& operator -= (const MemberPointer& memberPointer);  
  25.   
  26. HRESULT operator()(WPARAM wParam, LPARAM lParam);  
  27.   
  28. private:  
  29. std::vector<MemberPointer>    m_vtAllDelegate;  
  30. };  

 

[cpp] view plaincopy
  1. Delegates CPP文件  
  2.   
  3. //------------------------------------------------------------------------------  
  4. void MemberPointer::operator()( WPARAM w, LPARAM l )  
  5. {  
  6. const LPVOID pThis = this->pThis;  
  7. long address = this->address;  
  8. __asm  
  9. {  
  10.    mov   eax, l  
  11.    push eax  
  12.    mov   eax, w  
  13.    push eax  
  14.    mov   ecx, dword ptr[pThis]  
  15.    call address  
  16. };  
  17. }  
  18.   
  19. //------------------------------------------------------------------------------  
  20. MemberPointer& MemberPointer::operator=( const MemberPointer& span )  
  21. {  
  22. this->pThis   = span.pThis;  
  23. this->address = span.address;  
  24. return *this;  
  25. }  
  26.   
  27. //------------------------------------------------------------------------------  
  28. Delegate::Delegate( void )  
  29. {  
  30. ;  
  31. }  
  32.   
  33. //------------------------------------------------------------------------------  
  34. Delegate::~Delegate( void )  
  35. {  
  36. m_vtAllDelegate.clear();  
  37. }  
  38.   
  39. //------------------------------------------------------------------------------  
  40. Delegate& Delegate::operator+=(const MemberPointer& memberPointer )  
  41. {  
  42. m_vtAllDelegate.push_back(memberPointer);  
  43. return *this;  
  44. }  
  45.   
  46. //------------------------------------------------------------------------------  
  47. Delegate& Delegate::operator-=(const MemberPointer& memberPointer )  
  48. {  
  49. for (std::vector<MemberPointer>::iterator it = m_vtAllDelegate.begin();   
  50.    it!= m_vtAllDelegate.end() ; ++it)  
  51. {  
  52.    MemberPointer& mp = (*it);  
  53.    if (mp.address == memberPointer.address && mp.pThis == memberPointer.pThis)  
  54.    {  
  55.     m_vtAllDelegate.erase(it);  
  56.     break;  
  57.    }  
  58. }  
  59. return *this;  
  60. }  
  61.   
  62. //------------------------------------------------------------------------------  
  63. HRESULT Delegate::operator()( WPARAM wParam, LPARAM lParam )  
  64. {  
  65. HRESULT   hr = S_OK;  
  66. for (UINT uCnt = 0; uCnt < m_vtAllDelegate.size(); ++uCnt)  
  67. {  
  68.    m_vtAllDelegate[uCnt](wParam, lParam);  
  69. }  
  70. return   hr;  
  71. }  

 

 

使用举例:

class CTest

{

public:

    LRESULT   OnDoSomething(WPARAM w, LPARAM l){return 0;}

}

在某处要用到时

CTest                aTest;

Delegate    doSomethingDelegate;

doSomethingDelegate += MemberPointer(&aTest, &CTest::OnDClose);

 

调用

doSomethingDelegate(0xff, 0xff);

原创粉丝点击