首页 > 解决方案 > 自动将结构数组转换为 C++ 中的数组结构

问题描述

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

struct Widget
{
    Some field1;
    Another second_field;
    ...
};

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

struct Widgets
{
    vector<Some> field1;
    vector<Another> second_field;
    ...
};

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

Widget为了澄清,我正在寻找一种将结构转换为结构的自动或半自动方法Widgets,而无需手动编码所有样板胶水。

标签: c++metaprogramming

解决方案


核心功能可以使用std::transform几个 lambda 函数来实现。

要从 a 中获取std::vector<Some>a 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; });

我会让你弄清楚其余的。

Widget我正在寻找一种将结构转换为结构的自动或半自动方式Widgets,而无需手动编码所有样板胶水。

您必须为 . 的每个成员变量编写一些样板代码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);
}

并将其用作:

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

推荐阅读