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