Estoy usando gcc 4.6. Supongamos que hay un vector v de parámetros que tengo que pasar a una función variable f (formato const char *, ...).Pasando std :: vector <int> elementos a la función variadic
Un método de hacer esto es:.
void VectorToVarArgs(vector<int> &v)
{
switch(v.size())
{
case 1: f("%i", v[0]);
case 2: f("%i %i", v[0], v[1]);
case 3: f("%i %i %i", v[0], v[1], v[2]);
case 4: f("%i %i %i %i", v[0], v[1], v[2], v[3]);
// etc...
default:
break;
}
}
// where function f is
void f(const char* format, ...)
{
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
}
El problema es, por supuesto que no es compatible con un número arbitrario de elementos en el vector v Sin embargo, creo haber entendido cómo va_lists obras en las principio, es decir, mediante la lectura de los argumentos de la pila, a partir de la dirección del último argumento con nombre antes de "...", Ahora pensé que debería ser posible copiar los valores de los elementos del vector de un bloque de memoria (por ejemplo myMemBlock) y pasar su dirección como el segundo argumento después de 'formato'. Obviamente, eso requeriría que myMemBlock esté estructurado como se espera por f(), es decir, como una pila.
- ¿Es posible?
- Alternativamente, ¿es posible presionar los valores de elementos vectoriales en la pila real con alguna magia de ensamblador en línea, llamar a la función f() y limpiar la pila después?
Por último, cosas que no se preocupan por:
- El código no podría ser portátil. OK, solo estoy interesado en gcc.
- Puede haber otros enfoques que involucren hackers de preprocesador.
- Se desaconseja el uso de la función variadic para formatear como printf() para C++.
- Uso de funciones de plantilla variadic.
Por lo que sé, no es posible "forjar" su propia lista va_arg. Lo que podrías hacer es pasar el vector directamente al sobrecargar tu función f(). – Gui13
No quiero reimplementar va_arg, solo quiero imitar una pila para que va_arg funcione. – user1142580