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 的自动或半自动方式,而无需手动编码所有样板胶.
核心功能可以使用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)