【问题标题】:Get attribute by name按名称获取属性
【发布时间】:2025-11-25 07:15:02
【问题描述】:

我有一个包含大约 25 个元素的结构定义

struct X { field 1; field 2; .. };    

我正在尝试用一些地图值填充它

Map<String,String> A    

这样的事情做n次似乎很烦人

X->xx = A["aaa"]    

每次我想填写我的消息结构。

是否可以通过名称访问成员,例如

X->get_instance_of("xx").set(A["aaa"]);    

并将其放入循环中?

【问题讨论】:

  • 所有成员都是同一类型吗?
  • 循环什么?解决方案是设置一些绑定,但很难知道,因为您没有提供足够的信息。
  • 结构总是一样的?而且..字段类型相同吗?

标签: c++ struct getelementsbyname


【解决方案1】:

C++ 缺乏更多动态语言的内置 反射 功能,因此您无法使用该语言的开箱即用功能做您想做的事情。

但是,如果所有成员都属于同一类型,则可以使用指向成员的指针映射并稍作准备:

 // typedef for the pointer-to-member
 typedef int X::*ptr_attr;

 // Declare the map of pointers to members
 map<string,ptr_attr> mattr;
 // Add pointers to individual members one by one:
 mattr["xx"] = &X::xx;
 mattr["yy"] = &X::yy;

// Now that you have an instance of x...
 X x;
// you can access its members by pointers using the syntax below:
 x.*mattr["xx"] = A["aa"];

【讨论】:

  • 即使它们是不同的类型,也可以通过函数重载来完成。
  • @Nawaz 当然,但这需要完全不同的解决方案。此外,这种解决方案很可能比我提出的更优雅。
  • 是的。 @Johannes Schaub 在这里给出了一种这样的解决方案:*.com/a/287353/415784
【解决方案2】:

简短的回答:不。这是 C++,一种静态编译语言,其中结构成员名称由编译器转换为内存偏移量。它不像 PHP 或 Python 那样动态,所有变量引用都涉及运行时。

【讨论】:

    【解决方案3】:

    没有。 C++ 没有反射。 Java 确实如此。不出所料,Java 之类的语言比 C 之类的语言更可能遇到 SOA 相关的东西。

    【讨论】:

    • 不确定这是真的。 Java 中的 SOAP API 生成代码包装器作为编译步骤。为什么 C++ 不应该存在相同的情况?没有必要为此使用反射。
    • 当然也可以在 C++ 中使用成员指针和函数重载来完成。
    【解决方案4】:

    这实际上是不可能的;您需要的信息在运行时不再存在。您也许可以使用 map 和一些指针来做一些事情,但老实说,您最好将其包装在一个接受 map 并将值放入适当字段的函数中。

    【讨论】:

      【解决方案5】:

      您可以使用 set/get 访问器为您的结构创建一个包装对象,这将允许您迭代字符串值以填充/读取静态的底层结构。

      【讨论】:

        最近更新 更多