¡Necesito ayuda con C++, por favor!C++ Punteros de función con un número desconocido de argumentos
Estoy escribiendo un analizador de comandos para un pequeño juego de texto, y me he encontrado con algunos problemas. El analizador debe leer y analizar los comandos ingresados por el jugador.
La solución más obvia y sencilla de esto podría ser algo como esto (escrito en pseudo-código):
command <- read input from the player
if command == COMMAND1
do command1
else if command == COMMAND 2
do command2
...
estoy escribiendo en C++, así que estaba pensando que podría solucionar esto mediante el uso de una mapa asociativo y punteros de función. No estoy tan familiarizado con el uso de indicadores de funciones, por lo que puede ser por eso que estoy teniendo problemas. Lo que quiero hacer es tener algún tipo de bucle que espere la entrada, analizar la entrada que se inserta y llamar a una función dependiendo del comando dado. Aquí hay algo de C++ - ish pseudo-código que describe lo que estoy pensando:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
... // here, I get stuck on what to do..
}
así que espero que me hago un poco claro en lo que quiero que suceda. El jugador podría haber tenido algo de entrada como
> go south
y podría haber terminado el código con algo como:
destination = strtok(NULL, " ");
fptr(destination);
Básicamente, el valor devuelto por el mapa sería la función que realiza el comando " ir ", y esa función aparentemente toma un argumento, el destino. De nuevo, este es un código C++ - pseudo-ish. Así que obtuve el comando "ir" cubierto. Pero ahora digo que yo quiero tener el comando siguientes aparatos:
> attack troll with sword
Ahora me siento que tengo que hacer algo como:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
if(tok == "go"){
destination = strtok(NULL, " ");
fptr(destination);
} else if (tok == "attack") {
target = strtok(NULL, " ");
weapon = strtok(NULL, " ");
fptr(target, weapon);
}
}
Una vez más, esto es pseudo-código. Probablemente vea lo que me cuelga: tengo este mapa de indicadores de funciones, pero debido a que tengo un número variable de argumentos y tipos de argumentos porque quiero llamar diferentes funciones dependiendo de lo que obtuve como entrada, entonces pude ' He hecho esto sin un mapa y los indicadores de función que te mostré primero. ¿Hay alguna forma en que pueda hacer esto más general, sin tener que tener alguna cláusula if-else para averiguar cuántos argumentos aprobar?
Espero que entiendas lo que necesito ayuda :) Gracias por leer!
+1 para una mejor solución que mi idea (ahora que lo pienso), pero si 'typedef std :: vector TokenArray;' no deberías declarar ' tokens' en su bucle como un 'TokenArray' por coherencia? –
@Chris: Sí, buena llamada, escribí esa parte antes de escribir el typedef. –
+1, y también considere usar un adaptador de función ('std :: function' de C++ 0x o' boost :: function' para compiladores sin compatibilidad con C++ 0x), ya que eso le permitirá usar free funciones (estáticas) como en su solución o funciones miembro, o incluso adaptar diferentes firmas de funciones existentes. –