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

C++中替代switch/case的数值映射代码执行方案咨询

更简洁高效的C++多操作映射实现方案

针对你这种需要把连续递增数值映射到不同操作的场景,用函数指针数组或者std::function数组是最优解——比写50个switch case简洁太多,而且访问效率是O(1),和switch不相上下甚至更高效。

方案1:传统函数指针数组(轻量化无依赖)

这种方式最适合简单的算术操作,没有额外STL依赖,运行开销极小:

#include <cstddef>

// 定义匹配操作签名的函数指针类型
typedef float (*OpFunction)(float, float);

// 实现各个操作函数
float add(float a, float b) { return a + b; }
float sub(float a, float b) { return a - b; }
float mul(float a, float b) { return a * b; }
float div(float a, float b) { return a / b; }
// ... 依次添加剩余46个操作函数

// 操作数组:索引0对应foo=1,索引1对应foo=2,以此类推
const OpFunction operations[] = {add, sub, mul, div /* , ... 其他操作 */};
// 预计算数组大小,用于合法性检查
const size_t op_count = sizeof(operations) / sizeof(operations[0]);

int foo = {value};

float execute(float input_1, float input_2) {
    // 检查foo是否在合法范围(1到op_count)
    if (foo < 1 || foo > static_cast<int>(op_count)) {
        return 0;
    }
    // 通过索引直接调用对应操作
    return operations[foo - 1](input_1, input_2);
}

方案2:std::function结合Lambda(紧凑灵活)

如果不想单独编写大量操作函数,可以用std::function配合lambda表达式,代码更紧凑,还支持捕获外部变量(若有需求):

#include <vector>
#include <functional>

int foo = {value};

// 直接用lambda初始化操作列表
const std::vector<std::function<float(float, float)>> operations = {
    [](float a, float b) { return a + b; },
    [](float a, float b) { return a - b; },
    [](float a, float b) { return a * b; },
    [](float a, float b) { return a / b; },
    // ... 继续添加剩余46个lambda操作
};

float execute(float input_1, float input_2) {
    if (foo < 1 || foo > static_cast<int>(operations.size())) {
        return 0;
    }
    return operations[foo - 1](input_1, input_2);
}

额外优化提示

  • 若foo的取值范围是0~N-1,可直接用foo作为数组索引,省去foo-1的偏移计算。
  • C++11及以上版本可将操作数组/列表定义为constexpr,让编译器在编译期完成初始化,消除运行时开销。
  • 如果需要动态添加/修改操作,std::vector<std::function>比静态数组更灵活。

内容的提问来源于stack exchange,提问作者Game_Freeze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 08:53:12