繁体   English   中英

在 C++20 中迭代结构的成员

[英]Iterate members of struct in C++20

我记得 C++20 具有迭代结构中成员的功能,我阅读了一篇关于它的博客,其中包含示例代码,但我再也找不到它了。

例如:

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


struct Bar {
  std::string e;
  std::string f;
};

template <typename T>
void PrintMember (T& t) {
  // what to do to iterate members in C++ 20?
}

模板的代码可能看起来不像,因为 C++20 有概念。 知道如何编写代码来迭代FooBar中的成员吗?

PS我记得它使用概念来解决问题,但也许我错了或者博客错了(这就是我再也找不到它的原因),回答“不,你不能,即使在 C++ 20”是受欢迎的。

PPS 一件事我没有澄清,我不需要字段名称,但我需要迭代所有字段,包括继承的字段。

(在这里我假设您也想获取字段名称)

要在没有技巧的情况下实现这一点(例如,额外的工具或手动添加元信息),您需要 C++ 反射功能。

尽管它可以作为技术规范使用,但这还不是C++的一部分(C++20 是迄今为止的最新标准)。

您可以使用Boost PFR 库 要打印struct的成员,您可以简单地使用内置的boost::pfr::io实用程序:( godbolt )

template <typename T>
void PrintMember (const T& t) {
    std::cout << boost::pfr::io(t);
}

更一般地说,您可以使用boost::pfr::for_each_field : ( godbolt )

template <typename T>
void PrintMember (const T& t) {
    boost::pfr::for_each_field(t, [](auto&& x){
        std::cout << x << ' ';
    });
}

这两种解决方案都适用于 C++17。

关于打印成员字段名称。 如果不明确指定它们,恐怕目前是不可能的。 如果您对此感到满意,您可以尝试使用C++ 反射库,直到将反射集成到标准中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM