C++实现委托
来源:互联网 发布:c语言程序界面设计 编辑:程序博客网 时间:2024/05/24 07:09
一直以来总觉的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++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- [C++]实现委托模型
- 《Effective C#》:用委托实现回调
- Objective-C 协议 简介 +委托的实现
- Objective-C 协议 简介 +委托的实现
- Objective-C 协议 简介 +委托的实现
- Objective-C 协议 简介 +委托的实现
- Objective-C 协议 简介 +委托的实现
- 【C#】使用委托实现窗体传值
- C#- 委托
- C#- 委托
- RMQ问题
- MySQL索引bug
- COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM .
- http://www.bitsucker.com/archives/7
- 可变字符串函数 StringBuffer的应用
- C++实现委托
- Java中什么时候使用extends,什么时候使用implements?
- iphone ios 如何使用gcd,block
- java获取时间的方法归纳
- android 修改kernel后,需要更新bionic下的kernel文件
- linux下MySQL安装及设置
- 修改Android中strings.xml文件
- 一个iphone4和5屏幕兼容解决方案
- 循环-空心梯形