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