Мне нужна помощь с C++, пожалуйста!C++ Указатели функций с неизвестным числом аргументов
Я пишу парсер для небольшой текстовой игры, и у меня возникли некоторые проблемы. Парсер должен читать и анализировать команды, введенные игроком.
Наиболее очевидное и простое решение этой проблемы может быть что-то вроде этого (написано в псевдокоде):
command <- read input from the player
if command == COMMAND1
do command1
else if command == COMMAND 2
do command2
...
Я пишу в C++, так что я думал, что я мог бы решить эту проблему, используя ассоциативные карты и указатели функций. Я не знаю, как использовать указатели на функции, поэтому может возникнуть проблема. Я хочу сделать что-то вроде цикла, который ждет ввода, проанализирует введенный вход и вызовет функцию в зависимости от заданной команды. Вот некоторые C++ - иш псевдо-код, описывающий то, что я имею в виду:
while(1) {
cin >> input;
char * tok = strtok(input, " ")
functionpointer fptr = command_map.find(tok);
... // here, I get stuck on what to do..
}
Так что я надеюсь, что я заставляю себя несколько ясно, что я хочу, чтобы это произошло. Игрок мог иметь вход что-то вроде
> go south
и я мог бы закончил код что-то вроде:
destination = strtok(NULL, " ");
fptr(destination);
В основном, возвращенное значение из карты будет функция, которая выполняет команду " go ", и эта функция, по-видимому, принимает один аргумент, пункт назначения. Опять же, это некоторый C++ - псевдоиш-код. Поэтому я получил команду «go». Но теперь говорят, что я хочу иметь follwing команду:
> attack troll with sword
Теперь я чувствую, что мне нужно сделать что-то вроде:
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);
}
}
Опять же, это псевдо-код. Вероятно, вы видите, что я повесил трубку: у меня есть эта карта указателей на функции, но поскольку у меня есть переменное количество аргументов и тип аргументов, потому что я хочу вызывать разные функции в зависимости от того, что я получил в качестве входных данных, вы просто сделали это без указателей карты и функций, как я показал вам в первую очередь. Есть ли способ сделать это более общим, без необходимости иметь какое-либо предложение if-else, чтобы выяснить, сколько аргументов нужно пройти?
Надеюсь, вы понимаете, что мне нужно для помощи :) Спасибо за чтение!
+1 для лучшего решения, чем моя идея (теперь, когда я думаю об этом), но если вы 'typedef std :: vector TokenArray;' вам не следует объявлять ' tokens' в вашем цикле как «TokenArray» для согласованности? –
@ Крис: Да, хороший звонок, я написал эту часть, прежде чем я написал typedef. –
+1, а также рассмотреть возможность использования функционального адаптера ('std :: function' из C++ 0x или' boost :: function' для компиляторов без поддержки C++ 0x), так как это позволит вам использовать либо бесплатный (статические) функции, как в ваших решениях или функциях-членах, или даже адаптировать различные существующие сигнатуры функций. –