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

C#的委托机制的C++的一种实现DIY版

2009-10-19 16:21 796 查看
以下是C#的委托机制的的一个例子,不过只能支持非成员函数版

#include <list>

//////////////////////////////////////////////////////////////////////////
//R 返回值
//T 参数
//////////////////////////////////////////////////////////////////////////
template< typename R, typename T>
class Delegate
{
public:
//回调函数的名字
typedef R (__stdcall *RT)(T);
public:
Delegate<R,T>(RT r)
{
m_list.clear();
m_list.push_back(r);
};

inline Delegate<R,T>* operator+=(const RT p)
{
m_list.push_back(p);
return this;
};

inline Delegate<R,T>* operator-=(const RT p)
{
m_list.remove(p);
return this;
};

R DDoEvent(T t)
{
if (m_list.empty())
{
return NULL;
}
std::list<RT>::iterator iter = m_list.begin();
while (iter != m_list.end())
{
R r = (*iter)(t);
iter++;
}
return r;
};
private:
std::list<RT> m_list;
};


如果DDoEvent方法的返回值是空的情况下,无法通过编译,所以我又加了一个特化版的

//void偏特化
template<typename T>
class Delegate<void, T>
{
public:
typedef void (__stdcall *RT)(T);
public:
Delegate<void, T>(RT r)
{
m_list.clear();
m_list.push_back(r);
};

Delegate<void, T>* operator+=(const RT p)
{
m_list.push_back(p);
return this;
};

Delegate<void, T>* operator-=(const RT p)
{
m_list.remove(p);
return this;
};

void DDoEvent(T p)
{
if (m_list.empty())
{
return NULL;
}
std::list<RT>::iterator iter = m_list.begin();
while (iter != m_list.end())
{
(*iter)(p);
iter++;
}
};
private:
std::list<RT> m_list;
};


下一个版本是成员函数版,其实只是封装了一下回调函数而已。

但是缺陷就是只实现一个函数的通知,不能实现跨类不同方法的通知

template<typename BaseClass,typename T, typename R>
class NewDelegate
{
public:
// Constructor takes the values and stores them
NewDelegate(T *pObj, R (BaseClass::*pFunc)(T))
{
m_pObject = pObj;
m_pFunction = pFunc;
}
// Invokes the stored function
R operator()(T p)
{
return (m_pObject->*m_pFunction)(p);
}
private:
BaseClass *m_pObject; // Pointer to the object
R (BaseClass::* m_pFunction)(T); // Pointer to the function
};


其实以上三个都没有做到C#的委托机制(跨类的成员函数全部响应)。

用模板实现C#的委托机制感觉对于目前的我来说还是太难了。

于是转了一帖:(转)C#的委托机制的C++的一种实现。

代码非常简练,保存了函数指针的类型和成员函数的地址

其核心代码是用汇编来实现调用。

收藏并学习之。

地址:http://blog.csdn.net/Last_Impression/archive/2009/10/19/4698948.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: