You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))。

具体实现步骤

  1. 先定义匹配成员函数的指针类型,假设Alarms类的这些成员函数都是void(USHORT)类型:
using AlarmFunc = void (Alarms::*)(USHORT);
  1. 在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},
    // ... 其他对应字符串与函数指针的映射
};
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:22:32