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>在编译时进行类型检查,但这似乎不够.
没有明确的标准方法来做这样的事情,但你可以看看非标准的方式.例如,您可以使用boost::fusion.
BOOST_FUSION_ADAPT_STRUCT(
Foo,
(int, field1)
(double, field2)
(char, field3)
);
Run Code Online (Sandbox Code Playgroud)
adapt struct
之后,您可以使用类型Foo为fusion-sequence的对象,可以通过成员进行迭代.
小实例
| 归档时间: |
|
| 查看次数: |
2814 次 |
| 最近记录: |