Cómo iterar sobre una lista de argumentos de plantilla variada empaquetada
En C, iterar sobre una lista de argumentos de plantilla variada empaquetada plantea un desafío debido a la incapacidad de conocer el número de argumentos y recuperar datos de ellos individualmente. Este problema se ve agravado aún más por el uso de una macro en la construcción de la función, lo que impide llamadas recursivas.
Para solucionar este problema, la solución proporcionada emplea un tipo personalizado, cualquiera, que puede contener diferentes tipos de datos. Al pasar este tipo a una plantilla variada, los argumentos se expanden a un vector de cualquier objeto. Posteriormente, los elementos individuales de este vector se pueden recuperar usando funciones getter especializadas (get
Si bien este método realiza la tarea, requiere llamadas a funciones detalladas, como foo(arg(1000)). Para simplificar esto, buscamos un método de iteración más conciso o un equivalente de std::get() para listas de argumentos de plantillas variadas empaquetadas.
Solución que utiliza expresiones de plegado STL y Lambda
Para C 17 y versiones posteriores, se pueden utilizar expresiones de plegado junto con una función lambda para lograr la iteración. La lambda puede realizar operaciones arbitrarias dentro del bucle, incluido incrementar un contador e imprimir el argumento actual:
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 proporciona un mecanismo de iteración más conciso y legible.
Alternativas para lidiar con las interrupciones de bucle
Si bien la solución mencionada anteriormente realiza la tarea, carece de la capacidad de implementar pausas o retornos dentro del ciclo. Para solucionar esto, podemos utilizar soluciones alternativas como:
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