【引言】
看了很多文章介绍多播委托的实现,始终无法令我满意,最近的框架需要这样的东西,才逼迫我写一个出来。如果熟悉.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;
}
}
}
};
一切看起来是那么美好,但是美中不足的是不能够使用任意参数(模板?宏?),如果你细心的话,也会发现并不能使用成员函数指针,那么这个类意义在哪里?
欲知后事如何,且听下回分解。