通过C ++中的struct的成员变量进行迭代

时间:2018-04-10 17:35:34

标签: c++ loops struct foreach iteration

我有一个像这样的结构:

struct Player {
POINT3D headPosition;
POINT3D position;
POINT2D view;
INT32 health;
// etc...
};

我想迭代这个结构的成员来做一些动作,就像我们可以用其他语言中的 foreach 做的那样。

我有什么方法可以在C ++中做类似的事情吗?我的研究表明,本身不可能,我发现像Boost.Hana这样的库可以实现,但我想首先确定没有第三方库绝对没有其他办法。即使是宏或在编译时生成的东西也可以。因为我们确切地知道它必须以某种方式自动化结构。您可以在" foreach"中忽略与我的问题的不同数据类型相关的问题。循环我将成员变量赋予模板函数,该函数接受在该结构中找到的所有类型的变量。

感谢您对此事的帮助。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的,使用疯狂的俄罗斯黑客: - )

相关图书馆是Antony Polukhin "magic get"。具体来说,它提供了“for each field”mechanism,它采用带有自动参数类型的模板化lambda。例如:

struct simple {
    int a;
    char b;
    short d;
};

simple x {42, 'a', 3};
std::stringstream ss;

boost::pfr::for_each_field(
    x,
    [&ss](auto&& val) {
        ss << val << ' ';
    }
);

警告:这需要C ++ 14甚至C ++ 17才能工作!