在C++中自动将结构数组转换为数组结构

mec*_*cal 7 c++ metaprogramming

我有一个结构Widget,里面有几个字段:

struct Widget
{
    Some field1;
    Another second_field;
    ...
};
Run Code Online (Sandbox Code Playgroud)

从概念上讲,我需要这些小部件的数组或向量,即std::vector<Widget>.但出于性能原因,所有这些字段都应该在它自己的数组中,即:

struct Widgets
{
    vector<Some> field1;
    vector<Another> second_field;
    ...
};
Run Code Online (Sandbox Code Playgroud)

那么,考虑到WidgetC++中可能的方法是将它的字段分散到几个向量上,即将结构数组转换为字段数组的结构?一些合理元数据的手动定义是可以的(内部或外部Widget),但是没有额外元数据的解决方案是首选.

为了澄清,我正在寻找一种将Widgetstruct 转换为Widgetsstruct 的自动或半自动方式,而无需手动编码所有样板胶.

R S*_*ahu 7

核心功能可以使用std::transform和一些lambda函数实现.

为了得到一个std::vector<Some>std::vector<Widget>,使用方法:

 std::vector<Widget> v1 = { ... };
 std::vector<Some> v2(v1.size());
 std::transform(v1.begin(),
                v1.end(),
                v2.begin(),
                [](Widget const& w) -> Some { return w.field1; });
Run Code Online (Sandbox Code Playgroud)

我会让你弄明白其余的.

我正在寻找一种将Widgetstruct 转换为Widgetsstruct 的自动或半自动方式,而无需手动编码所有样板胶.

您必须为每个成员变量编写一些样板代码Widget.通过使用您自己的辅助功能,您将能够减少锅炉板代码的数量.

例如

template <typename FieldType, typename Lambda>
void scatter(std::vector<Widget> const& widgets,
             std::vector<FieldType>& fields,
             Lmabda l)
{
   fields.resize(widgets.size());
   std::transform(widgets.begin(), widgets.end(), fields.begin(), l);
}
Run Code Online (Sandbox Code Playgroud)

并将其用作:

 std::vector<Widget> v1 = { ... };
 Widgets w;
 scatter(v1, w.field1, [](Widget const& w) -> Some { return w.field1; });
 scatter(v1, w.second_field, [](Widget const& w) -> Another { return w.second_field; });
 ...
Run Code Online (Sandbox Code Playgroud)

  • @mechanical,你没有对你的问题的答案,但你声称理解什么是可能的,并在C++中明确定义的操作.有点谦虚会有所帮助. (2认同)