有什么方法可以遍历结构吗

Is there any way to iterate through a struct?

本文关键字:遍历 结构 什么 方法      更新时间:2023-10-16

我想遍历在其他库中定义的结构,该结构的源代码不在我的控制之下。因此,任何像前面的问题一样需要用自己的宏/适配器定义结构的lib在这里都不可用。我发现最接近的方法是使用boost::hana。然而,它仍然需要填充一个适配器,然后我才能迭代它。我在这里附上了一个例子。我想知道有没有什么方法可以自动化BOOST_HANA_ADAPT_STRUCT,这样我就不需要填写其中的所有结构成员名称(这些结构总共有一百多个成员(。

#include <iostream>
#include <boost/hana.hpp>
#include <typeinfo>
namespace hana=boost::hana;
struct adapt_test
{
std::string name;
int data;
};
BOOST_HANA_ADAPT_STRUCT(
adapt_test
, name
, data
);
auto names = hana::transform(hana::accessors<adapt_test>(), hana::first);
int main() {
hana::for_each(
names, 
[] (auto item)
{
std::cout << hana::to<char const *>(item) << std::endl;
}
);
adapt_test s1{"a", 2};
hana::for_each(
s1, 
[] (auto pair)
{
std::cout << hana::to<char const *>(hana::first(pair)) << "=" << hana::second(pair) << std::endl;
}
);
return 0;
}

您可以像一样使用Boost Flat Reflection

struct adapt_test
{
std::string name;
int data;
};
adapt_test s1{"a", 2};
std::cout << boost::pfr::get<0>(s1)  << std::endl;
std::cout << boost::pfr::get<1>(s1)  << std::endl;
boost::pfr::flat_for_each_field(s1, [] (const auto& field) { std::cout << field << std::endl; } );

附言:尊重@apolukhin对这个图书馆的尊重。

问题的基本答案是

C++不将标识符视为字符串文字(在某些情况下它确实很有用(,不幸的是,这类字符串之间没有桥梁。

希望有一天,某种标准会带来这种能力,让我们不必经历宏或代码生成,或者像这样做:告诉";请将我的CCD_ 3视为一对";,其中的含义是将firstsecond的类型与成员xy匹配,然后构建类型以使其工作,这对元组也非常有用。一种结构化模板匹配。

目前,据我所知,由于上述限制,可以做的最好的事情是将结构与元组匹配,而不使用名称(从C++17开始(,例如使用boost::hanaboost::fusion