Creo que el problema es bastante común. Tiene una cadena de entrada y tiene que llamar a una función según el contenido de la cadena. Algo así como un interruptor() para cadenas. Piensa en las opciones de línea de comando.Buscando el código más elegante despachador
Actualmente estoy 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) {
...
}
y en la cabecera
class Myclass {
void cmd_bar(string args);
void cmd_foo(string args);
}
Así que cada foo y bar tengo que repetir cuatro (4!) Veces. Sé que puedo alimentar los punteros de función y las cadenas a una matriz estática antes y hacer el envío en un bucle, guardando algunas líneas if ... else. ¿Pero hay algún truco de macro (o abuso de preprocesador, según el POV), que hace que sea posible definir de alguna manera la función y al mismo tiempo hacer que actualice la matriz automágicamente? Entonces, ¿tendría que escribir solo dos veces, o posiblemente una vez si se usa en línea?
Estoy buscando una solución en C o C++.
Esta pregunta se ha hecho en varias ocasiones, y he respondido aquí http://stackoverflow.com/questions/659581/replace-giant-switch-statement-with-what –
También está solicitando un esquema de registro de algún tipo para reduzca el esfuerzo en mantener el diccionario. – djna
Lo es, pero no creo que haya uno que lo satisfaga. Podrías hacer algo tosco y feo con macros, pero es más problemático de lo que vale. –