有什么方法可以遍历结构吗
Is there any way to iterate through a struct?
我想遍历在其他库中定义的结构,该结构的源代码不在我的控制之下。因此,任何像前面的问题一样需要用自己的宏/适配器定义结构的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视为一对";,其中的含义是将first
和second
的类型与成员x
和y
匹配,然后构建类型以使其工作,这对元组也非常有用。一种结构化模板匹配。
目前,据我所知,由于上述限制,可以做的最好的事情是将结构与元组匹配,而不使用名称(从C++17开始(,例如使用boost::hana
或boost::fusion
。
相关文章:
- 有什么方法可以遍历结构吗
- 遍历我的数据结构,并向其中输入随机值
- 结构化绑定:遍历元组的双端面
- 点遍历的最佳数据结构
- C++逐位增加指针遍历结构
- 如何使用指针遍历结构数组中的数组
- 我是否需要遍历升压 rtree 的层次结构才能实现最大效率?
- MessagePack C++-如何遍历未知的数据结构
- 如何调用遍历类层次结构的成员函数
- 树结构的通用遍历
- 如何遍历充满结构的数组
- C++,一个通用递归模板函数,用于遍历树状结构
- 提升 R 树是否支持层次结构遍历
- 按变量名遍历结构
- 在向量中遍历结构成员时出错
- 遍历结构元素向量
- 遍历内部带有结构的链表
- c++中带有向量的分层数据结构,可以自底向上和自顶向下遍历
- Libxmlrpc遍历结构体
- 设计数据结构来存储多键对象集,以便能够收集和遍历该集的超平面