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]();
大功告成!