C++ 能否构建包含嵌套结构体字段键与对应getter函数的哈希映射
C++ 嵌套结构体字段Getter哈希映射实现方案
可以实现,核心需要处理不同字段返回类型不一致的问题,C++17及以上版本推荐用类型安全的std::variant实现,代码示例如下:
首先是结构体定义:
#include <string> #include <unordered_map> #include <functional> #include <variant> #include <iostream> struct Person { struct JobDetails { std::string company_name; std::string address; }; JobDetails job_details; int32_t age; std::string name; };
核心实现步骤
- 定义返回值枚举类型和哈希映射类型:
// 枚举所有字段可能的返回类型 using FieldValueType = std::variant<int32_t, std::string>; // 哈希映射类型:键为字段名字符串,值为返回字段值的函数对象 using FieldGetterMap = std::unordered_map<std::string, std::function<FieldValueType(const Person&)>>;
- 初始化字段Getter映射:
const FieldGetterMap g_person_field_getters = { {"company_name", [](const Person& person) { return person.job_details.company_name; }}, {"address", [](const Person& person) { return person.job_details.address; }}, {"age", [](const Person& person) { return person.age; }}, {"name", [](const Person& person) { return person.name; }} };
- 使用示例:
int main() { Person test_person = { .job_details = {"某科技公司", "北京市海淀区"}, .age = 27, .name = "张三" }; // 读取公司名称 auto company_val = g_person_field_getters.at("company_name")(test_person); std::string company_name = std::get<std::string>(company_val); std::cout << "公司名称:" << company_name << std::endl; // 读取年龄 auto age_val = g_person_field_getters.at("age")(test_person); int32_t age = std::get<int32_t>(age_val); std::cout << "年龄:" << age << std::endl; return 0; }
其他可选方案
如果不需要类型校验,也可以用std::any替代std::variant作为返回值类型,使用时通过std::any_cast转换为对应类型即可,缺点是类型转换错误只有运行时才能发现,调试成本更高。
如果使用的C++版本低于17,可以自己实现类型擦除逻辑封装返回值,或者引入第三方反射库简化开发。
内容的提问来源于stack exchange,提问作者senloa
相关产品推荐
相关产品推荐

