在C++中实现多播委托(1)

【引言】

看了很多文章介绍多播委托的实现,始终无法令我满意,最近的框架需要这样的东西,才逼迫我写一个出来。如果熟悉.net的话,会发现使用委托是如此的简单,轻而易举的实现观察者模式,以c#为例,类似这样声明一个委托:

public delegate void MyDelegate(char c);
看起来似乎像函数指针,但实际上不是这样,只能说是形似神不似,c#编译器编译这段代码的时候,为这个委托生成一个类,派生自 MulticastDelegate,MulticastDelegate内部实现了多播委托,所以这是问题的关键。首先我们来尝试写一个简单的多播委托类。

class Delegate
{
private:
	typedef void (*fnPtr)();
	vector<fnPtr> m_fnPtrs;
public:
	void Invoke()
	{
		for(vector<fnPtr>::iterator itor=m_fnPtrs.begin();itor!=m_fnPtrs.end();itor++)
		{
			(*itor)();
		}
	}
	void operator +=(fnPtr f)
	{
		m_fnPtrs.push_back(f);
	}
	void operator -=(fnPtr f)
	{
		for(vector<fnPtr>::iterator itor=m_fnPtrs.begin();itor!=m_fnPtrs.end();itor++)
		{
			if(*itor == f)
			{
				m_fnPtrs.erase(itor);
				break;
			}
		}
	}
};

一切看起来是那么美好,但是美中不足的是不能够使用任意参数(模板?宏?),如果你细心的话,也会发现并不能使用成员函数指针,那么这个类意义在哪里?

欲知后事如何,且听下回分解。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值