array - vector class c++>
Cómo crear un std:: array con std:: transform sin el constructor predeterminado (1)
No con std::transform
, pero nada que una pequeña plantilla mágica no pueda arreglar.
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
y amigos son C ++ 14, pero fácilmente implementables en C ++ 11. Probablemente hay media docena de implementaciones en SO solo.
Tengo un std::array<Foo, 10>
y me gustaría crear un std::array<Bar, 10>
usando una función de Foo
a Bar
. Por lo general, usaría std::transform
así:
array<Bar, 10> bars;
transform(foos.begin(), foos.end(), bars.begin(), [](Foo foo){
return Bar(foo.m_1, foo.m_2);
});
Sin embargo, Bar
no tiene un constructor predeterminado, por lo que no puedo crear la matriz de bars
. Siempre podría usar vector
pero sería bueno poder usar array
para garantizar que siempre tenga exactamente 10 elementos. ¿Es eso posible?