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

如何简化C++中基于字符串数组的结构体成员赋值操作?

无需大量if-else,通过字符串映射结构体成员赋值的C++实现

你可以用结构体成员指针数组来实现,完全不用写几百行if-else分支,而且符合你不能用map的要求。

具体实现步骤:

  1. 定义一个辅助映射结构体,关联成员名称字符串和对应的结构体成员指针
  2. 把所有需要映射的成员放进静态数组
  3. 遍历字符串数组和映射数组,匹配成功后直接通过成员指针赋值

完整代码示例:

#include <string>

struct example{
   int a;
   int b;
   int c;
};

// 辅助映射结构体:关联成员名和成员指针
struct MemberMapping {
    const char* name;
    int example::*member_ptr; // 指向example结构体int类型成员的指针
};

int main() {
    std::string str[3] = {"a", "b", "c"};
    int values[3] = {1, 2, 3};

    // 构建成员映射数组,新增成员只需要在这里加一行
    MemberMapping mappings[] = {
        {"a", &example::a},
        {"b", &example::b},
        {"c", &example::c}
    };
    const size_t mapping_count = sizeof(mappings) / sizeof(mappings[0]);

    example obj; // 创建结构体实例(原代码直接用类型访问成员是错误的)

    // 遍历赋值,替代冗杂的if-else
    for (size_t i = 0; i < 3; ++i) {
        for (size_t j = 0; j < mapping_count; ++j) {
            if (str[i] == mappings[j].name) {
                obj.*(mappings[j].member_ptr) = values[i];
                break;
            }
        }
    }

    return 0;
}

优势说明:

  • 新增结构体成员时,只需要在mappings数组里添加一行对应关系,不用修改逻辑代码
  • 静态数组是编译期确定的,性能和直接写if-else差不多,适合复杂代码库场景
  • 完全避免了大量重复的if-else分支,代码可读性和维护性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:14