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;
}

Swift中Delegate的正确使用姿势

目标 在A类里面声明一个ADelegate的代理,B类遵循并使用ADelegate定义的函数。 实现A.swift//创建协议 protocol ADelegate:NSObjectProto...
  • feosun
  • feosun
  • 2017年06月22日 23:29
  • 1124

MRC下delegate野指针问题

近项目开发中,临时被调去修复一个页面返回时crash的问题。出现这个问题的原因也很巧合,正好服务地址在同事电脑上,也正巧网络请求响应时间狂慢!一个请求发出去回来的时间是40秒左右,要是在线上,肯定会让...
  • xdrt81y
  • xdrt81y
  • 2015年04月09日 15:04
  • 2962

C#delegate的C++简易实现

C#中delegate功能非常强大,使用起来也很方便,delegate使很多模式实现起来变得简单C#中的代理,用C++看起来应该像这样 : templateclass Delegate{ std::v...
  • Bobby136
  • Bobby136
  • 2006年02月08日 14:45
  • 790

jquery模仿QQ消息框

//作者:王珺//时间2009年6月30日9:02:51(修改)//版本:v 1.1.1.2(第二个版本)修正在发生滚动后点击关闭消息框不往下滚动的BUG(而是往上) (function($) ...
  • wangjun8868
  • wangjun8868
  • 2009年06月29日 15:37
  • 1359

iOS中的delegate的用法和规范

Objective-C中的delegatedelegate是Objective-C编写的应用中各种对象之间互相调用的主要方式之一. 通常情况下, 对象可以接收的消息都通过在接口文件中声明的方法来表示....
  • uxyheaven
  • uxyheaven
  • 2015年09月07日 09:56
  • 21705

AppDelegate文件的介绍和使用

UIApplication和delegate 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。 比如一个来电或者锁屏会导致app进入后台甚至被终止,还有很多其它类似的情况会导致app受到干扰...
  • suiyu1992
  • suiyu1992
  • 2016年07月30日 16:36
  • 643

C#中delegate用法(带参数)

近期写了几个C#客户端软件,其中,上传数据时另开线程,同时要更新UI,跨线程操作,用到委托。用法如下: //委托 public delegate void delegate1(string str)...
  • zhouyingge1104
  • zhouyingge1104
  • 2017年10月25日 18:38
  • 457

[原创]用C++模拟C#的event机制

本文章为farproc.com站长袁晓辉(海洋)的原创文章,作者保留所有权利。如果转载,请务必注明来自www.farproc.com!! 作为一个C++程序员,学习C#应该不是一件很困难的事情,因为C...
  • uoyevoli
  • uoyevoli
  • 2005年08月02日 18:08
  • 7237

delegate 为什么应该是 weak 类型而不是strong类型

delegate 为什么应该是 weak 类型而不是strong类型 循环引用 对象a创建并引用了对象b.对象b创建并引用了对象c.对象c创建并引用了对象b. 这时候b和c的引用计数分别...
  • fxmmc
  • fxmmc
  • 2014年10月16日 18:59
  • 1592

[Cocoa]处理消息的方法-Delegate

原文链接:http://www.cocoachina.com/b/?p=124 我们上次演示的程序在关掉了应用程序的窗口之后,应用程序并没有真正的退出,现在我们就来完成这个任务。 在 Mac,Win...
  • u011513212
  • u011513212
  • 2013年08月10日 16:06
  • 1293
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++简易模仿C#Delegate机制
举报原因:
原因补充:

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