【问题标题】:Modern way to access struct fields by name in C++在 C++ 中按名称访问结构字段的现代方法
【发布时间】:2020-08-18 10:58:10
【问题描述】:

我想检查在现代 C++ 中是否有一种直观且简单的方法可以按名称访问结构字段。 我知道已经提出并回答了类似的问题,而 C++ 反射是一个经过充分研究的主题。 我遇到过这样的库:

但所有这些方法的共同点是,它们只允许您获取结构内的字段总数或以for_each 的方式对结构的所有字段进行某种操作。

是的,通过使用这些库提供的for_each 功能,我显然可以检查我正在寻找的字段的特定“名称”。但我只是想检查是否有任何其他琐碎/知名的库已经这样做了。 我希望能够处理任意数量的嵌套结构,这就是为什么我要寻找开箱即用的东西。

正如 Louis Go 所指出的,拥有这样的访问器会很棒:

auto field = namespace::getField<mystruct>("fieldname");

【问题讨论】:

  • 也许发布伪代码来指定“如何”访问该字段? auto field = namespace::getField&lt;mystruct&gt;("fieldname");?
  • 您期望得到什么结果类型? struct 可以具有不同类型的字段,因此您必须获得 unionstd::variantstd::any。你要哪一个?
  • @LouisGo 确切地说,我已经根据您的建议编辑了我的问题。
  • @J.Schultke 使用上面的大多数反射库,用户无论如何都用一些宏重写了结构,所以我猜 std::variant 在指定的结构中所有可能的类型都可以

标签: c++ struct reflection template-meta-programming


【解决方案1】:

您可以使用成员访问运算符按名称访问班级成员。示例:

struct foo {
    int bar;
} instance;

instance.bar = 42; // access by name

如果您的意思是基于字符串变量而不是编译时标识符访问成员,那么不。从 C++20 开始的 C++ 还没有实现这一点所必需的反射特性。

当程序员想要这个时,他们实际需要的是一个关联容器,例如std::map

【讨论】:

  • 是的,我的意思是基于字符串变量访问成员。目的是为某些信号提供灵活的日志记录机制,由用户在运行时给出,这样我们就不需要序列化/记录整个庞大的嵌套结构系列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多