Entonces tengo 2 funciones que ambas tienen argumentos similares
void example(int a, int b, ...);
void exampleB(int b, ...);
Ahora example
llama exampleB
, pero ¿cómo puedo pasar las variables en la lista de argumentos de variable sin modificar exampleB
(ya que esto ya se usa en otros lugares también)?
c++
variadic-functions
No disponible
fuente
fuente
Respuestas:
No puede hacerlo directamente; tienes que crear una función que tome un
va_list
:fuente
, ...
la firma. Si ha convertido los argumentos de la variable en ava_list
, puede pasar elva_list
a otra función que solo tome ava_list
, pero esa función (o una a la que llama) debe tener alguna forma de saber qué hay enva_list
.Tal vez arrojar una piedra en un estanque aquí, pero parece funcionar bastante bien con las plantillas variadas de C ++ 11:
Al menos, funciona con
g++
.fuente
args...
debe crear versiones de estas funciones que tomen un va_list y las pasen. Mire
vprintf
como ejemplo:fuente
También quería ajustar printf y encontré una respuesta útil aquí:
Cómo pasar un número variable de argumentos a printf / sprintf
No estaba interesado en absoluto en el rendimiento (estoy seguro de que este fragmento de código se puede mejorar de varias maneras, no dude en hacerlo :)), esto es solo para depuración general, así que hice esto:
que luego puedo usar así
Los ostreams de c ++ son hermosos en algunos aspectos, pero prácticamente se vuelven horribles si desea imprimir algo como esto con algunas cadenas pequeñas como paréntesis, dos puntos y comas insertadas entre los números.
fuente
Por cierto, muchas implementaciones de C tienen una variación interna de v? Printf que, en mi humilde opinión, debería haber sido parte del estándar C. Los detalles exactos varían, pero una implementación típica aceptará una estructura que contenga un puntero de función de salida de caracteres e información que indique lo que se supone que debe suceder. Esto permite que printf, sprintf y fprintf utilicen el mismo mecanismo 'central'. Por ejemplo, vsprintf podría ser algo como:
La función core_printf entonces llama a p_inf-> func para cada carácter que se va a generar; la función de salida puede enviar los caracteres a la consola, un archivo, una cadena o algo más. Si la implementación de uno expone la función core_printf (y cualquier mecanismo de configuración que utilice), se puede extender con todo tipo de variaciones.
fuente
Una forma posible es usar #define:
fuente
Basado en el comentario que está terminando
vsprintf
, y que esto está etiquetado como C ++, sugiero que no intente hacer esto, sino que cambie su interfaz para usar iostreams C ++ en su lugar. Tienen ventajas sobre laprint
línea de funciones, como la seguridad de tipos y la posibilidad de imprimir elementos queprintf
no podrían manipularse. Un poco de retrabajo ahora podría ahorrar una cantidad significativa de dolor en el futuro.fuente
Al usar el nuevo estándar C ++ 0x, es posible que pueda hacer esto usando plantillas variadas o incluso convertir ese código antiguo a la sintaxis de la nueva plantilla sin romper nada.
fuente
Esta es la única forma de hacerlo ... y la mejor forma de hacerlo también ...
fuente