c++ 事件驱动,该如何解决

c++ 事件驱动
typedef void (*func)()
map<int,func> mapFunc;


int add1(int x)
{
  printf("%d\n",x)
}
int add2(int x,int y)
{
  printf("%d,%d\n",x,y)
}

mapFunc[1] = (func)add1;
然后想这么调用,
mapFunc[1](4);

请问上面怎么调用函数,或者用什么方法
我的初衷是
我可以注册事件比如:
1  =  add1
2  =  add2
其中,1,2的函数类型不相同的.
------解决方案--------------------
引用:
对,boost::function也不能完全实现我的功能,好像..
楼上说的有点道理,可以定义宏来使用..


使用宏的话没有动态修改能力,能调用的事件处理数量和类型都限定死了。我来写一个基于不定参数函数+hacking调用处理(不需要switch、if之类的判断)的方法,估计是最简单有效的处理方式了,当然也有一些缺点:移植到64位比较麻烦。


#include <stdio.h>

typedef void (*CommonFunc)();

const int MAXFUNC = 3;

CommonFunc Func[MAXFUNC];

int add1(int a)
{
  printf("data = %d\n", a);
  return a;
}

int add2(int a, int b)
{
  printf("data %d + %d = %d\n", a, b, a + b);
  return a + b;
}

int add3(int a, int b, int c)
{
  printf("data %d + %d + %d = %d\n", a, b, c, a + b + c);
  return a + b + c;
}


__declspec(naked) int CallFunc(int FuncID, ...)
{
  static int __retaddr;

  __asm{
    mov ecx,[esp+4]
    cmp ecx,MAXFUNC
    jnb __done
    lea edx,Func
    mov edx,[edx+ecx*4]
    pop __retaddr
    lea ecx,__cleanup  // fixup for bcc32: lea ecx,CallFunc+38
    mov [esp],ecx
    jmp edx
    nop  // fixup for bcc32
    nop  // fixup for bcc32
    nop  // fixup for bcc32
  __cleanup:
    sub esp,4
    push __retaddr
  __done:
    ret
  }
}


int main()
{
  Func[0] = (CommonFunc)add1;
  Func[1] = (CommonFunc)add2;
  Func[2] = (CommonFunc)add3;

  CallFunc(0, 12);
  CallFunc(1, 12, 13);
  CallFunc(2, 12, 13, 14);

  return 0;
}