C++中调用成员函数的if分支优化方案咨询
问题描述
我有如下代码:
HRESULT Block::SendAlarm(const std::string& variableName, USHORT value) { if (variableName == aAtt_name_Fault) builder.Alarms().Fault(value); if (variableName == aAtt_name_BATT) builder.Alarms().BATT(value); if (variableName == aAtt_name_PWR) builder.Alarms().PWR(value); if (variableName == aAtt_name_OCCLUSION) builder.Alarms().OCCLUSION(value); // ... 更多类似if语句 return S_OK; }
其中builder是Ventilator对象,Alarms()是builder的成员类及对象。目前我通过对比输入字符串,用if条件调用builder.Alarms()的成员函数,请问是否有更优的实现方式?
更优实现方案
可以用函数映射表替代大量if判断,核心是把字符串和对应成员函数指针绑定,初始化时构建映射关系,调用时直接查表执行,既提升可读性和维护性,执行效率也更高(哈希表查找为O(1),多if判断为O(n))。
具体实现步骤
- 先定义匹配成员函数的指针类型,假设
Alarms类的这些成员函数都是void(USHORT)类型:
using AlarmFunc = void (Alarms::*)(USHORT);
- 在
Block类的构造函数中构建哈希映射表(将映射表作为Block成员变量,避免每次调用重复构建):
std::unordered_map<std::string, AlarmFunc> alarmMap = { {aAtt_name_Fault, &Alarms::Fault}, {aAtt_name_BATT, &Alarms::BATT}, {aAtt_name_PWR, &Alarms::PWR}, {aAtt_name_OCCLUSION, &Alarms::OCCLUSION}, // ... 其他对应字符串与函数指针的映射 };
- 修改
SendAlarm函数,通过查表调用目标函数:
HRESULT Block::SendAlarm(const std::string& variableName, USHORT value) { auto it = alarmMap.find(variableName); if (it != alarmMap.end()) { (builder.Alarms().*(it->second))(value); } // 可选:处理未匹配到的情况,比如返回错误码 // else { return E_INVALIDARG; } return S_OK; }
额外优化点
- 若
aAtt_name_xxx是编译期常量,可用std::string_view代替std::string作为映射表的键,减少字符串拷贝开销。 - 可在未找到对应映射时返回
E_INVALIDARG这类错误码,增强代码健壮性。
内容的提问来源于stack exchange,提问作者amutamil
相关产品推荐
相关产品推荐

