一直以来总觉的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);