"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo podemos iterar de forma concisa sobre una lista de argumentos de plantilla variada empaquetada?

¿Cómo podemos iterar de forma concisa sobre una lista de argumentos de plantilla variada empaquetada?

Publicado el 2024-11-04
Navegar:370

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

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()), lo que permite la iteración sobre los diferentes tipos de datos.

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:

  • Usar try/throw: En este enfoque, podemos generar excepciones dentro de lambda para salir del ciclo. Sin embargo, este método puede afectar significativamente el rendimiento debido a la sobrecarga de excepciones.
  • Conmutadores de variable/if: Este enfoque implica crear una variable para controlar el bucle y usar declaraciones if para salir de él. el bucle. Si bien es efectivo, puede generar un código que sea menos agradable desde el punto de vista estético.
Declaración de liberación Este artículo se reimprime en: 1729667291 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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