C++简易模仿C#Delegate机制

来源:互联网 发布:邮件 rss源码 编辑:程序博客网 时间:2024/06/06 00:57

嗯,最近公司要求用C#做个项目,可惜我以前没怎么学过,所以恶补了下C#相关知识。由于在项目中频繁用到delegate机制,但是初看起来有点蒙。经过自己反复推敲,我觉得大致上算理解了它的机制,于是我用C++写了一些代码来模仿C#Delegate运行机制。

代码如下:


/**********************************************this a project to lmitation the C# delegate **                     **@author Kerwin                     **2012.3.20                            **18:10                                **********************************************/#include <iostream>#include <stdio.h>#include <vector>using namespace std;/** The base class of NoTypeDelegate and TypeDelegate*/class Delegate{public:virtual void Invoke() = 0;Delegate(){}virtual ~Delegate(){}};//class NoTypeDelegateclass NoTypeDelegate: public Delegate{public:NoTypeDelegate(void(*pfunc)(int),int iParam):Delegate(),m_pFunc(pfunc),m_iParam(iParam){}~NoTypeDelegate(){}void Invoke(){cout<<"NoTypeDelegate Invoke\r\n";m_pFunc(m_iParam);}private:void (*m_pFunc)(int);int m_iParam;};//TypeDelegatetemplate<typename T>class TypeDelegate : public Delegate{public:TypeDelegate(T& t,void(T::*pfunc)(int),int iParam):Delegate(),m_t(t),m_pFunc(pfunc),m_iParam(iParam){}~TypeDelegate(){}void Invoke(){cout<<"TypeDelegate Invoke\r\n";(m_t.*m_pFunc)(m_iParam);}private:void (T::*m_pFunc)(int);int m_iParam;T m_t;//T is a type,here as a class};//normal invoke functionvoid Test(int iParam){printf("Test Invoke %d\n",iParam);}//class TT class TT{public:void Test(int iParam){printf("TT::Test Invoke %d\n",iParam);}};int main(){NoTypeDelegate ntd(Test,1);TT t;// TT object to as class TypeDelegate member variableTypeDelegate<TT> td(t,TT::Test,2);vector<Delegate*> vecdelegate;vecdelegate.push_back(&ntd);vecdelegate.push_back(&td);typedef vector<Delegate*>::iterator pit;for(pit it = vecdelegate.begin(); it != vecdelegate.end(); it++){(*it)->Invoke();//RTTI function}return 0;}