近对编程语言的委托机制产生了浓厚的兴趣,C#,Objective-c的委托机制已经是各自强有力的编程规范工具,以下文字和代码是我近日对委托机制的理解,不妥之处,请及时指出。

  自我感觉C#的委托针对的对象是函数,学习它的用法会发现它有些像C语言的函数指针,而Objective-c的委托针对的对象是一个对象指针,这在我写的文章对Objective-c委托的理解一文中可以清楚得看到,很容易的理解到。回过头来说C#的委托,在C语言里面是函数指针,给个概念是回调,只不过官方说C#的实现是更加安全的函数指针,我是目前理解不能了,因为我还没有达到那个高度。

  来关注我们的主角:C++。针对对象模式的委托,用个观察者模式能很容易实现了,而且有关C++的观察者模式实现也是这样考虑的;那么对于函数指针的委托可以实现吗?现如今已经实现了,也已经用到工程中去了,不过我们还是好好研究一下好,因为我们的C++可是很难学的,我们必须掌握它的一点一滴。

  C++中回调一般似于这样:

typedef void (*Fun)();
void function(Fun fun) {...}

  我一直不明白啥是回调,但当我看到这个的时候我明白了,“调用你,终还是要调用我”。

  如何把它加入,融合观察者设计模式的通知机制呢?网上有很多解法,我也拷贝来了一份,把它加上注解,和大家一起学习。

//event.h
#ifndef _EVENT_H_
#define _EVENT_H_
#include <string>
#include <iostream>
#include <vector>
using namespace std;
template <typename Handler>
class event //模板类,这决定了这个委托可以委托任何类型了函数指针,只要你有,我能委托
{
public:
 event()
 {
 }
 event& operator+= (const Handler v)
 {
  add(v);
  return *this;
 }
 event& operator-= (const Handler v)
 {
  remove(v);
  return *this;
 }
 vector<Handler>& GetEvent()
 {
  return m_HandlerList;
 }
protected:
 virtual void add(Handler v)
 {
  m_HandlerList.push_back(v);
 }
 virtual void remove(const Handler v)
 {
  vector<Handler>::iterator it = m_HandlerList.begin();
  for( ; it != m_HandlerList.end() ; it++)
  {
   if((*it) == v)
   {
    m_HandlerList.erase(it);
    break;
   }
  }
 }
private:
 vector<Handler> m_HandlerList;
};
#endif