gpt4 book ai didi

c++ - 静态遍历 C++ 结构的所有成员

转载 作者:可可西里 更新时间:2023-11-01 16:10:00 32 4
gpt4 key购买 nike

有没有办法静态迭代 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可以运行模板函数 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);
}

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

编辑:struct 可能有很多字段,而且它们是预定义的,因此不能更改为其他类型。这也是在编译时,所以它与在运行时执行的“反射”关系不大,而与“模板编程”或“元编程”有关。我们有<type_traits>用于编译时的类型检查,但这似乎还不够。

最佳答案

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

BOOST_FUSION_ADAPT_STRUCT(
Foo,
(int, field1)
(double, field2)
(char, field3)
);

adapt struct之后,您可以使用 Foo 类型的对象作为融合序列,可以按成员迭代。 small live example

关于c++ - 静态遍历 C++ 结构的所有成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27687455/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com