[英]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 有概念。 知道如何编写代码来迭代Foo
和Bar
中的成员吗?
PS我记得它使用概念来解决问题,但也许我错了或者博客错了(这就是我再也找不到它的原因),回答“不,你不能,即使在 C++ 20”是受欢迎的。
PPS 一件事我没有澄清,我不需要字段名称,但我需要迭代所有字段,包括继承的字段。
您可以使用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.