C++ 环绕吊舱成员

C++ 环绕吊舱成员,c++,templates,introspection,C++,Templates,Introspection,我想知道如何正确地循环一个普通的旧数据类型的成员,以便获得关于它们的一些类型信息。即: struct my_pod { int a; double b; }; template<typename POD> void loopOverPOD() { for_each(POD, member) // The magic part { // member::type should be for my_pod int, then double

我想知道如何正确地循环一个普通的旧数据类型的成员,以便获得关于它们的一些类型信息。即:

struct my_pod
{
    int a;
    double b;
};

template<typename POD>
void loopOverPOD()
{
    for_each(POD, member) // The magic part
    {
        // member::type should be for my_pod int, then double
        typename member::type i;
        // member::size_of should be equal to sizeof(int) then sizeof(double)
        // Trivial if we can have member::type information.
        int size = member::size_of;
        // member::offset_of should be equal to 0, then sizeof(int)
        // Trivial if we can have member::size_of information.
        int offset = member::offset_of;
    }
}
struct my_pod
{
INTA;
双b;
};
模板
void loopOverPOD()
{
每个(豆荚,成员)//魔法部分
{
//member::type应该是my_pod int,然后是double
typename成员::type i;
//member::的size_应等于sizeof(int)然后等于sizeof(double)
//如果我们可以有member::type信息,那就很简单了。
int size=member::size\u of;
//成员::的偏移量_应等于0,然后是sizeof(int)
//如果我们可以拥有信息的member::size\u,那就很简单了。
int offset=成员::offset_of;
}
}
<> P>正如我在C++中所知道的那样,在不做一些棘手的模板操作的情况下,我们不能进行简单的类型内省。但在这里,我找不到一个模板的具体解决方案,即使使用了宏。问题更多的是关于我,而不是关于解决方案的存在。:-)

我并不是在要求一个不会造成干扰的解决方案


提前感谢。

C++没有可以迭代结构成员的构造


然而,存在一个标准类型
std::tuple
,您可以使用模板在编译时递归迭代其元素。

您可以使用boost.fusions将POD转换为序列,然后使用fusions将函数对象应用于每个成员。这是非侵入性的,您的POD类型将保持为POD

好的是,您甚至可以将ADAPT_STRUCT宏放在与结构定义分开的(头)文件中,并且只在需要迭代的代码中使用它们


另一方面,这个宏需要重复提及成员的类型和名称。我想fusion会在某个时候使用C++11特性来消除冗余(再次提到类型)。同时,还可以创建一个宏来声明结构和ADAP_结构部分。

如果使用C++14及更高版本,可以使用
Boost.Precise and Flat Reflection
()在POD上循环,并使用
Boost::typeindex::type_id_runtime(field)
打印类型:

#include <iostream>
#include <boost/pfr/precise.hpp>
#include <boost/pfr/flat.hpp>
#include <boost/type_index.hpp>

struct my_pod
{
    int a;
    double b;
};

struct my_struct
{
    char c;
    my_pod pod;
};

int main() {
    my_pod val{1, 2.5};

    my_struct var{'a', 1, 2.5};

    std::cout <<  "Flat:\n";
    boost::pfr::flat_for_each_field(var, [](const auto& field, std::size_t idx) {
        std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << "; value: " << field << '\n';
    });

    std::cout <<  "\nNot Flat:\n";
    boost::pfr::for_each_field(var, [](const auto& field, std::size_t idx) {
        using namespace boost::pfr::ops;
        std::cout << idx << ": " << boost::typeindex::type_id_runtime(field) << "; value: " << field << '\n';
    });
}

虽然我不知道如何在这种情况下得到偏移……/P>这是不可能考虑使用而不是POD类型的。@ CaseBoovivysSTD::tuple是一个POD,如果与POD模板参数一起使用?反射不是C++语言的一部分。但这可以通过外部工具来完成,例如Boost Reflect Library()。您试图解决的真正问题是什么?你可以用一些语言来解决的许多问题在C++中被不同地解决了。谢谢。即使宏被认为是邪恶的,对于POD类型来说,它们看起来也不是那么邪恶。

Flat:
0: char; value: a
1: int; value: 1
2: double; value: 2.5

Not Flat:
0: char; value: a
1: my_pod; value: {1, 2.5}