Sto provando a generare un elenco di argomenti per una chiamata di funzione durante il runtime, ma non riesco a pensare a un modo per farlo in C++.Creazione dinamica di un elenco di argomenti della funzione C++ in fase di esecuzione
Questo è per una libreria di supporto che sto scrivendo. Sto prendendo i dati di input dal client su una rete e usando quei dati per effettuare una chiamata a un puntatore a funzione che l'utente ha impostato in precedenza. La funzione accetta una stringa (di token, simile a printf) e una quantità variabile di argomenti. Quello di cui ho bisogno è un modo per aggiungere più argomenti a seconda di quali dati sono stati ricevuti dal client.
sto memorizzare le funzioni in una mappa di puntatori a funzione
typedef void (*varying_args_fp)(string,...);
map<string,varying_args_fp> func_map;
Un esempio d'uso potrebbe essere
void printall(string tokens, ...)
{
va_list a_list;
va_start(a_list, tokens);
for each(auto x in tokens)
{
if (x == 'i')
{
cout << "Int: " << va_arg(a_list, int) << ' ';
}
else if(x == 'c')
{
cout << "Char: " << va_arg(a_list, char) << ' ';
}
}
va_end(a_list);
}
func_map["printall"] = printall;
func_map["printall"]("iic",5,10,'x');
// prints "Int: 5 Int: 10 Char: x"
Questo funziona bene quando hardcoding la chiamata di funzione ed è argomenti, ma se io Abbiamo ricevuto i dati "CreateX 10 20", il programma deve essere in grado di fare in modo che l'argomento si chiami da solo. es.
// func_name = "CreateX", tokens = 'ii', first_arg = 10, second_arg = 20
func_map[func_name](tokens,first_arg,second_arg);
Non riesco a prevedere come gli utenti stenderanno le funzioni e codificheranno questo in anticipo.
Se qualcuno ha suggerimenti per eseguire questa operazione in un altro modo, sentiti libero di suggerire. Ho bisogno che l'utente sia in grado di "associare" una funzione alla libreria e che la libreria la chiami più tardi dopo aver ricevuto i dati da un client di rete, un callback in sostanza.
runtime numero di argomenti variabile? Non è possibile in C++ AFAIK, o sarebbe comunque molto brutto. Il problema (sintattico) non è quello di riceverli, ma piuttosto di passarli. Dovrebbe essere possibile in assembler, però. In C++, preferisci usare una struttura dati per archiviare gli argomenti e passare questa struttura, come un 'std :: list'. Suggerisco di dare un'occhiata a boost.spirit –
dyp
Questo modo di passare il numero variabile di argomenti è deprecato in C++ –
Questo era il mio pensiero iniziale, ma se una funzione richiede 2 diversi tipi di argomenti, quindi non posso memorizzarli insieme . – PudgePacket