"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como inicializar elegantemente um `std::array` com tipos construtíveis não padrão?

Como inicializar elegantemente um `std::array` com tipos construtíveis não padrão?

Publicado em 2024-11-24
Navegar:581

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

Inicialização elegante de std::array com tipo construtível não padrão

Inicializando um std::array com um tipo não padrão tipo de elemento construtível pode ser uma tarefa complicada. Repetir manualmente o valor n vezes é ineficiente e sujeito a erros para n grandes.

Para resolver esse problema, uma abordagem mais elegante envolve a utilização de um tipo de sequência e um gerador. A ideia principal é criar uma sequência de índices de 0 a n-1 e, em seguida, usar uma função para aplicar repetidamente um valor a cada índice.

Aqui está uma implementação:

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 um std::array usando esta abordagem:

template
void f(T value)
{
  // genseq_t is seq
  std::array items = repeat(value, genseq_t{});
}

Além disso, as seguintes definições são usadas:

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 solução fornece uma maneira eficiente e elegante de inicializar std::array com tipos construtíveis não padrão, independentemente do valor de n.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3