Указатели функций 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 ++ - псевдо-код. Так что я получил команду "идти". Но теперь скажите, что я хочу получить следующую команду:

> 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, чтобы выяснить, сколько аргументов нужно передать?

Надеюсь, вы понимаете, с чем мне нужна помощь :) Спасибо за чтение!

9
задан tobier 20 November 2010 в 19:01
поделиться