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

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;
};

核心实现步骤

  1. 定义返回值枚举类型和哈希映射类型:
// 枚举所有字段可能的返回类型
using FieldValueType = std::variant<int32_t, std::string>;
// 哈希映射类型:键为字段名字符串,值为返回字段值的函数对象
using FieldGetterMap = std::unordered_map<std::string, std::function<FieldValueType(const Person&)>>;
  1. 初始化字段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; }}
};
  1. 使用示例:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:24:02