使用标准库和函数指针简化switch语句

本文介绍了一种利用C++标准库中的map容器简化Windows GUI应用程序中消息处理的方法。通过将命令字符串映射到对应的处理函数,避免了冗长的switch-case结构,使代码更加清晰和易于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]();
    大功告成!
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值