gpt4 book ai didi

c++ - 遍历 POD 成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:45 25 4
gpt4 key购买 nike

我想知道如何正确地遍历普通旧数据类型的成员,以便获得关于它们的一些类型信息。那就是:

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;
}
}

据我所知,在 C++ 中,如果不对模板进行一些棘手的操作,我们就无法进行简单的类型自省(introspection)。但是在这里,即使使用宏,我也找不到具体的模板解决方案。问题更多的是关于我而不是关于解决方案的存在。 :-)

我不一定要寻求不会造成干扰的解决方案。

提前致谢。

最佳答案

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

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

不利的一面是,此宏需要重复提及成员的类型和名称。我想在某个时候融合将使用 C++11 功能来摆脱冗余(再次提到类型)。同时,可以创建一个宏来声明结构和 ADAP_STRUCT 部分。

关于c++ - 遍历 POD 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17394661/

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