c++ - 有没有办法遍历结构?

标签 c++

我想遍历一个在其他库中定义的结构,其源不在我的控制之下。因此,任何需要使用自己的宏/适配器定义结构的库,如 previous questions不能在这里使用。我发现最接近的方法是使用 boost::hana .但是,它仍然需要填充一个适配器,然后我才能对其进行迭代。我附上了一个 example here.我想知道有什么方法可以自动化 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++ - 有没有办法遍历结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60398990/

相关文章:

c++ - 将消息注入(inject) WPF 应用程序消息泵

c++ - 数组的地址是否等于 C++ 中第一个元素的地址?

c++ - 为什么 Eclipse 会在我的源代码中标记伪错误?

c++ - 设置一系列基类/派生类来处理天气数据

c++ - 使用使用私有(private)字段的基类方法

c++ - 是否有一个库可以在 C++ 中创建一组具有相同名称和索引的目录?

c++ - libstdc++-6.dll 问题

c++ - 连接 : No such Slot QTreeView

C++:输入和输出流运算符:关联性

c++ - 缺少类型说明符错误