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

原创 2012年03月30日 18:56:54

嗯,最近公司要求用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 NoTypeDelegate
class 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;
};

//TypeDelegate
template<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 function
void 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 variable
	TypeDelegate<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;
}

相关文章推荐

[UE4蓝图教程]蓝图入门之类蓝图

这一次说一下类蓝图,上次说过,类蓝图就是把蓝图封装成一个类,然后调用它的方法就好,下面是一个类蓝图的示例,具体操作请看虚幻4的官方视频,英语不好没关系,可以先看操作。...

使用c++实现事件注册

     今天上软件体系结构时,学了一种EventSystem的结构,是java中向控件注册事件等时使用的一种模式.下课时我思考了一下,在c++中使用函数指针可以方便的实现这种方法.下面是我实现了的一...

【C++】C++简易实现C#的delegate

主要实现了C#委托的广播功能,没有实现删除委托等功能,关于泛型协C++11中的std::function 变之类功能没有测试。 边查资料边写的,很多说法可能不标准,详细参见参考资料。 参考资料: ...

在C++中实现C#的delegate机制

由于这段时间较忙,自从上次我发布了一个供初学者学习的“MFC”程序后,就没怎么写文章了。这段时间在忙新的项目,项目逻辑还算复杂,用了好多有闪光点的技术,下面我要讨论的是闪光点之一:在C++中实现C#的...

使用C#的Delegate机制实现资源的异步读取的类

制作网页网游,常常需要从Server端临时下载一个资源进来,然后读取,通常使用WWW下载AssetBundle的方法来实现。而下载过程需要时间,不可能立即完成,这通常需要提供下载需求的用户自己实现同步...

C#中delegate的机制原理

C#下的关键字delegate实际上是告诉编译器生成一个继承自MulticastDelegate的密封类。而该类的主要职责是创建函数的回调环境。 而生成的密封类定义如下: namespace D...
  • argpunk
  • argpunk
  • 2014年12月24日 10:58
  • 4723

C#不是C++ 之 委托(Delegate)

http://www.cnblogs.com/xiaomi7732/archive/2010/03/07/1680413.html C#不是C++ 之 委托(Delegate) Posted on ...

一种ACM评判内核简易实现 使用C# WEB调用C++编译器的方法

作者:chenjieb520(两片森林)          相信很多做过ACM竞赛题目的人都知道:你提交了代码之后,系统就会对的代码进行编译,然后给出代码的编译的信息还有执行结果。很多人都不太明白...

C++实现C#事件机制

  • 2011年11月22日 18:31
  • 6.8MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++简易模仿C#Delegate机制
举报原因:
原因补充:

(最多只允许输入30个字)