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
相关产品推荐
相关产品推荐

