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.
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