"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo inicializar elegantemente un `std::array` con tipos construibles no predeterminados?

¿Cómo inicializar elegantemente un `std::array` con tipos construibles no predeterminados?

Publicado el 2024-11-24
Navegar:780

How to Elegantly Initialize a `std::array` with Non-Default-Constructible Types?

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.

Último tutorial Más>

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