现代C++中访问结构体字段的方法

6
我想确认在现代C ++中是否有一种直观且易于访问结构体字段的方法。 我知道类似的问题已经有人提出并回答了,而且C ++反射是一个深入研究的主题。 我发现了一些库,例如: 但所有这些方法的共同点是它们仅允许您获取结构中字段的总数或针对结构的所有字段以 for_each 方式执行某个操作。
是的,显然我可以使用这些库提供的 for_each 功能来检查特定字段的“名称”。但我只是想检查是否有任何其他简单/知名的库已经做到了这一点。 我希望能够处理任意数量的嵌套结构体,这就是为什么我正在寻找一些现成的解决方案。
正如Louis Go所指出的,拥有一个访问器会很棒:
auto field = namespace::getField<mystruct>("fieldname");

2
也许可以发布伪代码来指定“如何”访问字段?auto field = namespace::getField<mystruct>("fieldname"); - undefined
您期望获得什么样的结果类型?由于struct可以拥有不同类型的字段,因此您需要获取一个unionstd::variantstd::any。您想要哪一个? - undefined
@LouisGo 没错,我已经按照你的建议编辑了我的问题。 - undefined
@J.Schultke 大多数反射库都需要用户使用一些宏重写结构体,因此我认为在结构体中指定所有可能的类型,使用 std::variant 应该是可以的。 - undefined
2个回答

1
对于简单的结构体,现在可以使用最新版本的Boost PFR在C++20模式下完成此操作。
#include <boost/pfr.hpp>

#include <iostream>
#include <string>

struct Foo {
  int a;
  float b;
  std::string c;
};

int main() {
  Foo foo {42, 3.1415, "hello world"};
  boost::pfr::for_each_field(foo, [](const auto f, auto i) {
    std::cout << boost::pfr::get_name<i, Foo>() << ": " << f << '\n';
  });
}

使用g++ -std=c++20 -o foo foo.cpp编译后,运行./foo将打印以下内容:
a: 42
b: 3.1415
c: hello world

-3

您可以使用成员访问运算符按名称访问类成员。例如:

struct foo {
    int bar;
} instance;

instance.bar = 42; // access by name

如果您想基于字符串变量而不是编译时标识符访问成员,那么不行。截至C++20,C++仍然没有反射功能来实现这一点。
通常,当程序员需要这样做时,他们实际上需要的是关联容器,例如std::map。

1
是的,我的意思是根据字符串变量访问成员。目的是为了拥有灵活的日志记录机制,仅针对用户在运行时给定的某些信号,这样我们就不需要序列化/记录整个嵌套结构族,这些结构非常庞大。 - undefined
我想知道C++为什么会有这种限制。也许可以使用元组代替常规结构体。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接