![](/img/trans.png)
[英]How can I initialize an std::array of a class without a default constructor?
[英]How to create a std::array with std::transform without default constructor
我有一个std::array<Foo, 10>
,我想使用Foo
到Bar
的函数创建一个std::array<Bar, 10>
。 通常我会像这样使用std::transform
:
array<Bar, 10> bars;
transform(foos.begin(), foos.end(), bars.begin(), [](Foo foo){
return Bar(foo.m_1, foo.m_2);
});
但是, Bar
没有默认构造函数,因此我无法创建bars
数组。 我总是可以使用vector
但是能够使用array
来保证我总是有10个元素会很好。 那可能吗?
不是用std::transform
,但没有一点模板魔法无法修复。
template<std::size_t N, std::size_t... Is>
std::array<Bar, N> foos_to_bars(const std::array<Foo, N>& foos,
std::index_sequence<Is...>) {
return {{ Bar(foos[Is].m_1, foos[Is].m_2)... }};
}
template<std::size_t N, std::size_t... Is>
std::array<Bar, N> foos_to_bars(const std::array<Foo, N>& foos) {
return foos_to_bars(foos, std::make_index_sequence<N>());
}
std::index_sequence
和朋友是C ++ 14,但在C ++ 11中很容易实现。 仅在SO上可能有六个实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.