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:
(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), ...);
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&&...) {} }; }
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