Penso che il problema sia piuttosto comune. Hai una stringa di input e devi chiamare una funzione a seconda del contenuto della stringa. Qualcosa come un interruttore() per le stringhe. Pensa alle opzioni della riga di comando.Alla ricerca del più elegante dispatcher di codici
Attualmente sto usando:
using std::string;
void Myclass::dispatch(string cmd, string args) {
if (cmd == "foo")
cmd_foo(args);
else if (cmd == "bar")
cmd_bar(args);
else if ...
...
else
cmd_default(args);
}
void Myclass::cmd_foo(string args) {
...
}
void Myclass::cmd_bar(string args) {
...
}
e nell'intestazione
class Myclass {
void cmd_bar(string args);
void cmd_foo(string args);
}
Così ogni foo e bar devo ripetere quattro (4!) Volte. So che posso alimentare i puntatori e le stringhe di funzione a un array statico prima e fare il dispatching in un ciclo, salvando alcuni se ... altre linee. Ma c'è qualche trucco macro (o abuso del preprocessore, a seconda del POV), che rende possibile definire in qualche modo la funzione e allo stesso tempo aggiornare automaticamente l'array? Quindi dovrei scriverlo solo due volte, o forse una volta se usato in linea?
Sto cercando una soluzione in C o C++.
Questa domanda è stata posta più volte e mi ha risposto qui http://stackoverflow.com/questions/659581/replace-giant-switch-statement-with-what –
Chiede anche uno schema di registrazione di qualche tipo a ridurre lo sforzo nel mantenere il dizionario. – djna
Lo è, ma non credo che ce ne sia uno che lo soddisfi. Potresti fare qualcosa di grezzo e di brutto con i macro, ma è più un problema che ne vale la pena. –