Вызов соответствующих методов для данной команды - PullRequest
1 голос
/ 18 февраля 2012

Я делаю командную строку в C ++.Я хотел бы, чтобы пользователь вводил строку, например «сказать что-то».Затем он будет разделен так, что «say» будет именем команды, а «что-то» будет параметром.Пока все хорошо - это уже работает.

Затем я хотел бы использовать имя команды для вызова соответствующего метода.Я мог бы использовать какую-то справочную таблицу, но есть ли лучший метод?

Ответы [ 3 ]

2 голосов
/ 18 февраля 2012

C ++ не поддерживает никаких отражений: какой-либо вид отображения таблиц в функциональных объектах - лучший из известных мне подходов.

2 голосов
/ 18 февраля 2012

вероятно, вам нужно что-то вроде карты ключевых слов команды и указателей на функции или методы

#include <string>
#include <map>

class CmdHandler // our handler class
{
public:
    void Handler(const std::string &arg){}//our handler method
};


typedef void (CmdHandler::*MethodPtr)(const std::string &); // make typedef to easily deal with the type of the member-function pointer

std::map<std::string, MethodPtr> my_handlers; // make our method lookup table

int _tmain(int argc, _TCHAR* argv[])
{
    CmdHandler handler;
    //add a real member-function pointer for the "say" command
    my_handlers.insert(std::make_pair("say", &CmdHandler::Handler));

    //look for the handler of command "say" and call it instantly 
    (handler.*my_handlers["say"])("something");
    return 0;
}
1 голос
/ 18 февраля 2012

Таблица поиска - это обычный метод. Обычно, std::map ... и если вы используете повышение, вы можете посмотреть на boost::function и boost::bind.

Также обратите внимание, что вы можете найти макрос компилятора __FUNCTION__ (который расширяется до недекорированного имени текущей функции во время компиляции и часто используется в сообщениях об ошибках - возможно, вам придется удалить класс имена из имен функций-членов) полезны в командных функциях, для того, чтобы зарегистрировать функции на карте, чтобы вы могли избежать неправильных написаний и лишней типизации.

(обратите внимание, что BOOST_CURRENT_FUNCTION может быть более переносимым макросом.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...