C++ delegate

原创 2012年03月21日 15:14:38
#ifndef __delegate_h__
#define __delegate_h__

#include <vector>

class IDelegateObject
{
public:
	virtual bool istype(const std::type_info& typeinfo) = 0;
	virtual bool equal(IDelegateObject*) = 0;
	virtual void invoke() = 0;
};

static void DestroyDelegateObject( IDelegateObject*& ppObj )
{
	if( ppObj )
	{
		delete ppObj;
		ppObj = NULL;
	}
}

class TDelegate;
class TDelegateFunction : public IDelegateObject
{
	friend class TDelegate;
public:
	typedef void (*DelegateImpl)();
public:
	TDelegateFunction( DelegateImpl pImpl )
	{
		m_pImpl = pImpl;
	}
	static TDelegateFunction* TDelegateFunction::New( DelegateImpl pImpl )
	{
		TDelegateFunction* pDelegate = new TDelegateFunction( pImpl );
		return pDelegate;
	}
	static void TDelegateFunction::Destory( TDelegateFunction*& pDelegate )
	{
		if( pDelegate )
		{
			delete pDelegate;
			pDelegate = NULL;
		}
	}
protected:
	 bool istype( const std::type_info& typeinfo )
	 {
		 return ( typeid(TDelegateFunction) == typeinfo ) ? true : false;
	 }
	 bool equal( IDelegateObject* pobj )
	 {
		if( pobj != 0 && pobj->istype( typeid( TDelegateFunction ) ) )
		 {
			 TDelegateFunction* cast_ptr = static_cast<TDelegateFunction*>( pobj );
			 return ( cast_ptr->m_pImpl == m_pImpl );
		 }
		 return false;
	 }
	 virtual void invoke()
	 {
		 if( m_pImpl == 0 )
			 return;
		 (m_pImpl)();
	 }
private:
	DelegateImpl m_pImpl;
};

template<typename T>
class TDelegateMethod : public IDelegateObject
{
	friend class TDelegate;
public:
	typedef void (T::*DelegateImpl)();
public:
	TDelegateMethod( T* pObj, DelegateImpl pImpl )
	{
		m_pObj = pObj;
		m_pImpl = pImpl;
	}

	static TDelegateMethod* TDelegateMethod::New( T* pObj, DelegateImpl pImpl )
	{
		TDelegateMethod* pDelegate = new TDelegateMethod( pObj, pImpl );
		return pDelegate;
	}

	static void TDelegateMethod::Destory( TDelegateMethod*& pDelegate )
	{
		if( pDelegate )
		{
			delete pDelegate;
			pDelegate = NULL;
		}
	}
protected:
	bool istype( const std::type_info& typeinfo )
	{
		return ( typeid( TDelegateMethod ) == typeinfo ) ? true : false;
	}
	bool equal( IDelegateObject* pobj )
	{
		if( pobj != 0 && pobj->istype( typeid( TDelegateMethod ) ) )
		{
			TDelegateMethod* cast_ptr = static_cast<TDelegateMethod*>( pobj );
			return ( cast_ptr->m_pObj == m_pObj && cast_ptr->m_pImpl == m_pImpl );
		}
		return false;
	}
	virtual void invoke()
	 {
		 if( m_pImpl == 0 || m_pObj == 0)
			 return;
		 (m_pObj->*m_pImpl)();
	 }
private:
	T* m_pObj;
	DelegateImpl m_pImpl;
};

class TDelegate
{
private:
	std::vector<IDelegateObject*> m_objs;
	typedef std::vector<IDelegateObject*>::iterator OBJITER;

	TDelegate(const TDelegate& src);
	void operator=(const TDelegate& src);

public:
	TDelegate(){}
	~TDelegate()
	{
		OBJITER iter = m_objs.begin();
		while( iter != m_objs.end() )
		{
			if( (*iter) != 0 )
			{
				DestroyDelegateObject( (*iter) );
			}
			iter = m_objs.erase(iter);
		}
	}
public:
	void operator()()
	{
		OBJITER iter = m_objs.begin();
		while( iter != m_objs.end() )
		{
			(*iter)->invoke();
			iter++;
		}
	}

	TDelegate& operator +=( IDelegateObject* pObj )
	 {
		OBJITER iter = m_objs.begin();
		for( ; iter != m_objs.end(); iter++)
		{
			if( (*iter) != 0 && (*iter)->equal(pObj) )
			{
				DestroyDelegateObject(pObj);
				return *this;
			}
		}
		m_objs.push_back( pObj );
		return *this;
	 }

	TDelegate& operator -=( IDelegateObject* pObj )
	 {
		OBJITER iter = m_objs.begin();
		for( ; iter != m_objs.end(); iter++)
		{
			if( (*iter) != 0 && (*iter)->equal(pObj) )
			{
				if( (*iter) != pObj )
					DestroyDelegateObject((*iter));
				m_objs.erase( iter );
				break;
			}
		}
		
		DestroyDelegateObject( pObj );
		return *this;
	 }
};

#endif

C++中实现委托(delegate)

  • 2011年05月06日 13:07
  • 5.1MB
  • 下载

使用蓝图(Blueprint)绑定多播委托(Multicast Delegate)【UE4】【C++】

本例将讲解 如何在 C++ 中创建一个多播委托,然后在运行时通知一组的 Actors(即广播事件给监听事件的对象们)首先创建一个 继承自 StaticMeshActor 的类,命名为 KingKing...

一个C++ delegate的实现

一个C++ delegate的实现 更新说明: 修改了借口,增加了对smart_ptr的支持。 最近需要一个C++delegate的实现,比较接近C#的delegate的用法。翻遍了bo...
  • ilvu999
  • ilvu999
  • 2012年09月06日 00:13
  • 299

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

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

在C++中实现委托(Delegate)

原文地址 个人理解: 说明: 最近在阅读设计模式相关的内容, 正好看到观察者模式的部分, 发现.net 有一个委托机制, 本质上就是函数指针对象。 这篇大作中...

成员函数指针与高效C++委托 (delegate)

原文地址:http://www.cnblogs.com/cappuccino/p/3262056.html 下载实例源代码 - 18.5 Kb下载开发包库文件 - 18.6 Kb 概要 ...

c++ delegate 最大16个参数,用程序生成的代码

delegate.hpp 委托类 程序生成的代码,最大支持16个参数,支持__cdecl、__stdcall、__fastcall 编辑器不支持C11也能用,c++builder 6.0测试可用 ...

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

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

c++高效委托的实现(fast delegate---简单、高效、跨平台)

概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(delegates), 在类似的语言中已经体现出了它的价值. 在 Delp...

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

由于这段时间较忙,自从上次我发布了一个供初学者学习的“MFC”程序后,就没怎么写文章了。这段时间在忙新的项目,项目逻辑还算复杂,用了好多有闪光点的技术,下面我要讨论的是闪光点之一:在C++中实现C#的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ delegate
举报原因:
原因补充:

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