繁体   English   中英

有没有办法遍历结构?

[英]Is there any way to iterate through a struct?

我想遍历一个在其他库中定义的结构,其源不在我的控制之下。 因此,任何需要像以前的问题一样使用自己的宏/适配器定义结构的库在此处均不可用。 我发现最接近的方法是使用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;
}

您可以使用增强平面反射,例如:

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; } );

PS 尊重@apolukhin这个图书馆。

您问题的基本答案是否定的

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

希望某个标准有一天会带来这种能力,让我们不必经历宏或代码生成,或者可能像这样做不同的事情:告诉“请把我的struct A { int x, y; }作为一对”,其中意思是将firstsecond类型与成员xy匹配,然后构建类型以使其工作,这对元组也非常有用。 一种结构化模板匹配。

由于上述限制,目前我所知道的最好的方法是将结构体与元组进行匹配(从 C++17 开始),例如使用boost::hanaboost::fusion

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM