如何简化C++中基于字符串数组的结构体成员赋值操作?
无需大量if-else,通过字符串映射结构体成员赋值的C++实现
你可以用结构体成员指针数组来实现,完全不用写几百行if-else分支,而且符合你不能用map的要求。
具体实现步骤:
- 定义一个辅助映射结构体,关联成员名称字符串和对应的结构体成员指针
- 把所有需要映射的成员放进静态数组
- 遍历字符串数组和映射数组,匹配成功后直接通过成员指针赋值
完整代码示例:
#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
相关产品推荐
相关产品推荐

