"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 podemos iterar concisamente uma lista de argumentos de modelos variados compactados?

Como podemos iterar concisamente uma lista de argumentos de modelos variados compactados?

Publicado em 2024-11-04
Navegar:637

How Can We Iterate Over a Packed Variadic Template Argument List Concisely?

Como iterar em uma lista de argumentos de modelo variádico compactada

Em C , iterar em uma lista de argumentos de modelo variádico compactada representa um desafio devido a a incapacidade de saber o número de argumentos e recuperar dados deles individualmente. Esse problema é ainda agravado pelo uso de uma macro na construção da função, o que impede chamadas recursivas.

Para resolver isso, a solução fornecida emprega um tipo personalizado, qualquer, que pode conter diferentes tipos de dados. Ao passar esse tipo para um modelo variado, os argumentos são expandidos em um vetor de quaisquer objetos. Posteriormente, os elementos individuais deste vetor podem ser recuperados usando funções getter especializadas (get()), permitindo a iteração sobre os diferentes tipos de dados.

Embora este método realize a tarefa, ele requer chamadas de função detalhadas, como foo(arg(1000)). Para simplificar isso, buscamos um método de iteração mais conciso ou um equivalente de std::get() para listas de argumentos de modelos variados compactados.

Solução usando STL Fold Expressions e Lambda

Para C 17 e posterior, expressões fold podem ser utilizadas junto com uma função lambda para obter iteração. O lambda pode realizar operações arbitrárias dentro do loop, incluindo incrementar um contador e imprimir o argumento atual:

template 
void Foo (Ts && ... inputs)
{
    int i = 0;

    ([&]
    {
        // Do things in your "loop" lambda

          i;
        std::cout << "input " << i << " = " << inputs << std::endl;

    } (), ...);
}

Este método fornece um mecanismo de iteração mais sucinto e legível.

Alternativas para lidar com quebras de loop

Enquanto a solução mencionada acima realiza a tarefa, falta a capacidade de implementar quebras ou retornos dentro do loop. Para resolver isso, podemos utilizar soluções alternativas como:

  • Usando try/throw: Nessa abordagem, podemos lançar exceções dentro do lambda para sair do loop. No entanto, esse método pode impactar significativamente o desempenho devido à sobrecarga de exceções.
  • Switches variáveis/if: Esta abordagem envolve a criação de uma variável para controlar o loop e o uso de instruções if para interromper o laço. Embora eficaz, pode levar a um código menos agradável esteticamente.
Declaração de lançamento Este artigo foi reimpresso em: 1729667291 Se houver alguma violação, entre em contato com [email protected] para excluí-lo
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