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

C++ 在C+中迭代结构的成员+;20,c++,c++20,C++,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

我记得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?
}
structfoo{
std::字符串a;
std::字符串b;
std::字符串c;
}; 
结构条{
std::字符串e;
std::字符串f;
};
模板
无效打印成员(T&T){
//在C++ 20中迭代成员怎么办?
}
模板的代码可能不是这样的,因为C++20得到了一些概念。你知道如何编写代码来迭代
Foo
Bar
中的成员吗

另外,我记得它是用概念来做的,但也许我错了,或者博客错了(这就是为什么我再也找不到了),欢迎回答“不,你不能,即使是在C++20中”

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

(这里我假设您也希望获得字段名)

要实现这一点,不需要技巧(例如,附加工具或手动添加元信息),你需要C++的反射能力。 尽管它是作为一个标准提供的,但它还不是(C++20是迄今为止最新的标准)的一部分。

您可以使用。要打印
struct
的成员,只需使用内置的
boost::pfr::io
实用程序:()

这两种解决方案都在C++17中工作


关于打印成员字段名。如果不明确指定它们,恐怕目前无法实现。如果你不介意的话,你可以试着使用一个直到。

谢谢你的回答,我记得博客使用了概念来做这个把戏,但它可能是错的,这就是为什么我再也找不到它了。如果没有其他人回答,我将接受这个答案。更准确地说,这个答案只适用于需要访问字段名称的情况。如果不需要名称,只需按索引引用字段,这可以在C++17中完成。本质上,它是一个结构化绑定的应用程序。不,我不需要字段名,只需要调用字段上的方法,你能解释一下如何使用C++17来实现这一点吗?使用C++17中的结构化绑定,可以解压任何结构:例如,对于具有三个成员的结构:
auto&[a,b,C]=struct\u val当一个人有许多具有不同数量变量的结构化绑定时,可以自动检测成员的数量。但是不需要实现所有缺少的样板代码来通过索引访问某个成员。例如,它由PFR库实现(如另一个答案所示)。本质上,它以未命名元组的形式提供对任何结构的访问。如果需要一个域名,我们必须等待反思。它不会成为未来C++ 20的一部分……这就是你要问的吗?dupe of and Others有一些库,我们正在努力使其成为一项功能,但遗憾的是它仍然不可用。我们必须等待。我也希望有这样的功能,它可以节省大量的死记硬背的编码,你所要做的就是手动将结构成员名与它们的值配对。没错,但它不会打印字段名,只打印值。(即使OP没有指定他/她是否希望包含字段名)@AndreasH。我用允许打印成员名称的反射库的引用更新了答案。您好,似乎不支持继承类,但感谢您提供了解决方案。@psionic12如果此答案或Andreas H.的答案解决了您的问题,您可以使用复选标记将一个答案标记为已接受:。
template <typename T>
void PrintMember (const T& t) {
    std::cout << boost::pfr::io(t);
}
template <typename T>
void PrintMember (const T& t) {
    boost::pfr::for_each_field(t, [](auto&& x){
        std::cout << x << ' ';
    });
}