您的位置:首页 > 编程语言 > C语言/C++

(转)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);

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: