CopyRight by MikeFeng
如果你是一个Windows GUI程序员,那么经常应该会碰到对于消息的switch吧。面对冗长的switch语句,有什么简化方法呢?
很容易想到对switch的每个case进行包装,这样你的switch就会像下面一样:
switch
(1) {
case
1:
func1();
break;
case
2:
func1();
break;
default
:
return;
}
在case多的情况下还是很麻烦。考虑这个情况,你需要处理很多命令,对于每个命令都要有一个处理函数。如果要用if..esle来处理未免太麻烦了些。于是想到可以用映射的关系来实现彻底简化,方法如下:
#include
<map>
typedef
void (*HANDLER)(void* context);
typedef
std::map<char*, HANDLER> CMDMAP;
首先定义函数指针HANDLER,具体类型可以按照需求更改。然后就是定义map映射关系,CMDMAP就是一个将字符串和函数指针联系起来的映射。如果有两个命令处理函数是样子的:
void
list_handler(void* context)
{
}
void
quit_handler(void* context)
{
}
那么你就可以为你的CMDMAP类型实例中添加映射:
CMDMAP mapCmd;
mapCmd["LIST"
] = list_handler();
mapCmd["QUIT"] = quit_handler();
这样子就可以在必要的地方根据命令字符串来调用list_handler或者quit_handler了。假设命令字符串是cmd,这样就能调用了:
mapCmd[cmd]();
大功告成!