Ho bisogno di aiuto con C++, per favore!C++ Puntatori di funzione con numero sconosciuto di argomenti
Sto scrivendo un parser di comandi per un piccolo gioco di testo, e ho incontrato alcuni problemi. Il parser dovrebbe leggere e analizzare i comandi inseriti dal lettore.
La soluzione più ovvia e semplice per questo potrebbe essere qualcosa di simile (scritto in pseudo-codice):
command <- read input from the player
if command == COMMAND1
do command1
else if command == COMMAND 2
do command2
...
sto scrivendo in C++, così mi è stato pensare che potrei risolvere questo problema utilizzando un mappa associativa e puntatori di funzioni. Non sono così familiare nell'usare i puntatori di funzioni, quindi potrebbe essere il motivo per cui ho dei problemi. Quello che voglio fare è avere una sorta di loop che aspetta input, analizzare l'input che viene inserito e chiama una funzione a seconda del comando dato. Ecco qualche C++ - ish pseudo-codice che descrive quello che penso:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
... // here, I get stuck on what to do..
}
quindi spero mi faccio un po 'chiare su quello che voglio che accada. Il giocatore avrebbe potuto avere qualcosa di ingresso come
> go south
e ho potuto finire il codice con qualcosa di simile:
destination = strtok(NULL, " ");
fptr(destination);
In sostanza, il valore restituito dalla mappa sarebbe la funzione che esegue il comando " vai ", e apparentemente questa funzione prende un argomento, la destinazione. Di nuovo, questo è un codice pseudo-ish C++. Quindi ho ottenuto il comando "go" coperto. Ma ora dico che voglio avere il comando follwing:
> attack troll with sword
Ora mi sento che ho bisogno di fare qualcosa di simile:
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);
}
}
Ancora una volta, questo è pseudo-codice. Probabilmente vedrai cosa mi viene a capo: ho questa mappa di puntatori di funzioni, ma perché ho un numero variabile di argomenti e tipi di argomenti perché voglio chiamare funzioni diverse a seconda di quello che ho ricevuto come input, quindi potrei ' Ho appena fatto questo senza una mappa e puntatori di funzioni come ti ho mostrato prima. C'è un modo per renderlo più generale, senza dover avere una clausola if-else per capire quanti argomenti passare?
Spero che tu sappia cosa ho bisogno di aiuto con :) Grazie per la lettura!
+1 per una soluzione migliore della mia idea (ora che ci penso), ma se si 'typedef std :: vector TokenArray;' non dovresti dichiarare ' token nel tuo ciclo come 'TokenArray' per coerenza? –
@Chris: Sì, buona telefonata, ho scritto quella parte prima di scrivere il typedef. –
+1, e considera anche l'uso di un adattatore di funzione ('std :: function' da C++ 0x o' boost :: function' per i compilatori senza supporto C++ 0x), in quanto ti permetterà di usare entrambi funzioni (statiche) come nella soluzione o funzioni membro, o persino adattare differenti firme di funzioni esistenti. –