"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 invocar una función en todos los argumentos de plantilla variables en C++?

¿Cómo invocar una función en todos los argumentos de plantilla variables en C++?

Publicado el 2024-11-19
Navegar:430

How to Invoke a Function on All Variadic Template Arguments in C  ?

Plantillas variables de C: invocar una función en todos los argumentos de plantilla

En C, a menudo es deseable iterar a través de argumentos de plantilla variables y realizar una operación específica, como llamar una función. Esto se puede lograr usando:

C 17 Fold Expression

(f(args), ...);

Sin embargo, si la función llamada potencialmente devuelve un objeto con un operador de coma sobrecargado, deberías usar:

((void)f(args), ...);

Pre-C 17 Solución

Un enfoque común es aprovechar la inicialización de la lista y realizar la expansión dentro de ella:

{ print(Args)... }

Dado que print() devuelve void , puede solucionar el problema devolviendo int:

{ (print(Args), 0)... }

Para garantizar que esto funcione con cualquier número de argumentos, puedes hacer que el paquete siempre tenga al menos un elemento:

{ 0, (print(Args), 0)... }

Puedes encapsular este patrón en una macro reutilizable:

namespace so {
    using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }

Para manejar operadores de coma sobrecargados, puede modificar la macro:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \
        ::so::expand_type{ 0, ((PATTERN), void(), 0)... }

Si le preocupa la asignación de memoria innecesaria, puede definir un tipo personalizado que admita lista- inicialización pero no almacena datos:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&&...) {}
    };
}
Ú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