Sto utilizzando gcc 4.6. Supponiamo che ci sia un vettore v di parametri che devo passare ad una funzione variadica f (formato const char *, ...).Passaggio di articoli std :: vector <int> a variadic
Un approccio di fare questo è:.
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);
}
Il problema è, naturalmente, che non supporta un numero arbitrario di elementi nel vettore v Tuttavia, credo di aver capito come va_lists opere in principio, cioè leggendo gli argomenti dallo stack, iniziando dall'indirizzo dell'ultimo argomento denominato prima di "...", Ora pensavo che fosse possibile copiare i valori degli elementi vettoriali in un blocco di memoria (ad esempio myMemBlock e passa il suo indirizzo come secondo argomento dopo "formato". Ovviamente ciò richiederebbe che myMemBlock sia strutturato come previsto da f(), cioè come una pila.
- È una cosa fattibile?
- In alternativa, è possibile spostare i valori degli elementi vettoriali nello stack reale con alcune magie assembler inline, , funzione di chiamata f() e pulire lo stack in seguito?
Infine, cose che non si preoccupano:
- Il codice potrebbe essere non portabile. OK, sono solo interessato a gcc.
- Potrebbero esserci altri approcci che coinvolgono l'hackery del preprocessore.
- L'utilizzo della funzione variadic per la formattazione come printf(), è sconsigliato per C++.
- Utilizzo delle funzioni del modello variadic.
Da quello che so, non è possibile "forgiare" la propria lista va_arg. Quello che potresti fare è passare il vettore direttamente sovraccaricando la tua funzione f(). – Gui13
Non voglio reimplementare va_arg, voglio solo imitare uno stack per cui va_arg a operare. – user1142580