静态迭代C++结构的所有成员

WiS*_*GaN 10 c++ metaprogramming

有没有办法静态迭代C++结构的所有成员?

假如我们有许多预定义的结构,如下所示:

struct Foo {
    int field1;
    double field2;
    char field3;
    ...
    int field9;
};
struct Bar {
    double field14;
    char field15;
    int field16;
    bool field17;
    ...
    double field23;
};
Run Code Online (Sandbox Code Playgroud)

我们想要一个模板功能

template<typename T>
void Iterate(T object);
Run Code Online (Sandbox Code Playgroud)

这样就Iterate可以Add在所有类型的成员上运行模板功能T.例如,Iterate<Foo>并且Iterate<Bar>将成为

void Iterate<Foo>(Foo object) {
    Add<int>(object.field1);
    Add<double>(object.field2);
    Add<char>(object.field3);
    ...
    Add<int>(object.field9);
}
void Iterate<Bar>(Bar object) {
    Add<double>(object.field14);
    Add<char>(object.field15);
    Add<int>(object.field16);
    Add<bool>(object.field17);
    ...
    Add<double>(object.field23);
}
Run Code Online (Sandbox Code Playgroud)

这可以通过编写另一个解析struct定义并生成cpp文件的程序来完成,但这样做太麻烦,需要额外的编译和执行.

编辑:结构可能有许多字段,它们是预定义的,因此不能更改为其他类型.这也是在编译时,所以它与"反射"关系不大,"反射"是在运行时执行的,更多地与"模板编程"或"元编程"有关.我们<type_traits>在编译时进行类型检查,但这似乎不够.

For*_*veR 5

没有明确的标准方法来做这样的事情,但你可以看看非标准的方式.例如,您可以使用boost::fusion.

BOOST_FUSION_ADAPT_STRUCT(
   Foo,
   (int, field1)
   (double, field2)
   (char, field3)
);
Run Code Online (Sandbox Code Playgroud)

adapt struct 之后,您可以使用类型Foo为fusion-sequence的对象,可以通过成员进行迭代. 小实例