【发布时间】:2014-12-29 10:52:47
【问题描述】:
有没有办法静态迭代 C++ 结构的所有成员?
假设我们有很多预定义的结构,看起来像:
struct Foo {
int field1;
double field2;
char field3;
...
int field9;
};
struct Bar {
double field14;
char field15;
int field16;
bool field17;
...
double field23;
};
我们想要一个模板函数
template<typename T>
void Iterate(T object);
这样Iterate 可以对T 类型的所有成员运行模板函数Add。例如,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);
}
这可以通过编写另一个程序来解析struct定义并生成cpp文件来完成,但这太麻烦了,需要额外的编译和执行。
编辑:结构体可能有很多字段,并且它们是预定义的,因此不能更改为其他类型。这也是在编译时,所以它与在运行时执行的“反射”关系不大,更多的是与“模板编程”或“元编程”有关。我们有 <type_traits> 在编译时进行类型检查,但这似乎还不够。
【问题讨论】:
-
听起来你想要一个
std::tuple。我尝试了类似的 here 并在生产中使用了解决方案。 -
对我来说这是一个基本的设计方面。可能使用异构容器。
-
c++ 没有反射。
-
你看过Boost序列化库吗?
标签: c++ metaprogramming