c++ - biblioteca - ¿Por qué std:: array no tiene un constructor que tome un valor para que la matriz se llene?
std::array c++ (4)
Es la ausencia de
std::array<T,size>::array(const T& value);
¿un descuido? Me parece muy útil, y los contenedores dinámicos (como std::vector
) tienen un constructor similar.
Soy plenamente consciente de
std::array<T,size>::fill(const T& value);
pero eso no es un constructor, y la memoria será puesta a cero primero. ¿Qué pasa si quiero todo -1
como este tipo ?
En primer lugar, no es std::array<T>
, es std::array<T,N>
donde N
es la expresión integral constante de tiempo de compilación.
Segundo, std::array
se agrega por diseño. Por lo tanto, no tiene nada que lo haga no agregado, por lo que no tiene constructor ... y destructor, funciones virtuales, etc.
Puede usar la std::index sequence
para eso:
namespace detail
{
template <typename T, std::size_t...Is>
std::array<T, sizeof...(Is)> make_array(const T& value, std::index_sequence<Is...>)
{
return {{(static_cast<void>(Is), value)...}};
}
}
template <std::size_t N, typename T>
std::array<T, N> make_array(const T& value)
{
return detail::make_array(value, std::make_index_sequence<N>());
}
std::make_index_sequence
es C ++ 14, pero puede implementarse en C ++ 11.
Tenga en cuenta que puede simular de manera eficiente este tipo de constructor aprovechando el hecho de que la matriz no se inicializa en cero, y tiene un constructor de copia y lo hace.
template <size_t N, class T>
array<T,N> make_array(const T &v) {
array<T,N> ret;
ret.fill(v);
return ret;
}
auto a = make_array<20>(''z'');
std::array
es, por diseño, un agregado, por lo que no tiene constructores declarados por el usuario.
Como dices, podrías usar fill
después de la construcción predeterminada. Dado que es un agregado, la construcción predeterminada no pondrá a cero la memoria, pero la dejará sin inicializar (si el tipo contenido es trivialmente inicializable).