Inicialización elegante de std::array con un tipo constructible no predeterminado
Inicializando un std::array con un tipo no predeterminado El tipo de elemento construible puede ser una tarea engorrosa. Repetir manualmente el valor n veces es ineficiente y propenso a errores para n grandes.
Para abordar este problema, un enfoque más elegante implica utilizar un tipo de secuencia y un generador. La idea clave es crear una secuencia de índices de 0 a n-1 y luego usar una función para aplicar repetidamente un valor a cada índice.
Aquí hay una implementación:
template
auto repeat(T value, seq) -> std::array
{
// Unpack N, repeating `value` sizeof...(N) times
// Note that (X, value) evaluates to value
return {(N, value)...};
}
Para inicializar un std::array usando este enfoque:
template
void f(T value)
{
// genseq_t is seq
std::array items = repeat(value, genseq_t{});
}
Además, se utilizan las siguientes definiciones:
template
struct seq
{
using type = seq;
static const std::size_t size = sizeof ... (N);
template
struct push_back : seq {};
};
template
struct genseq : genseq::type::template push_back {};
template
struct genseq : seq {};
template
using genseq_t = typename genseq::type;
Esta solución proporciona una forma eficiente y elegante de inicializar std::array con tipos construibles no predeterminados, independientemente del valor de n.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3