为给定命令调用适当的方法

时间:2012-02-18 14:26:22

标签: c++ command-prompt

我在C ++中创建命令提示符。我希望用户输入诸如“说些什么”之类的行。然后将其拆分,以便“说”将是命令名称,“某事物”将是参数。到目前为止,这很好 - 这已经有效了。

然后我想使用命令的名称来调用适当的方法。我可以使用某种查找表但是有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

可能你需要类似命令关键字和函数或方法指针的地图

#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 :(得分:2)

C ++不支持任何类型的反射:某种表映射名称到函数对象是我所知道的最佳方法。

答案 2 :(得分:1)

查找表是常用的方法。通常情况下,std::map ...如果你正在使用提升,则可能需要查看boost::functionboost::bind

另请注意,您可能会发现编译器宏__FUNCTION__(在编译时扩展为当前函数的未修饰名称,并且通常用于错误消息中 - 您可能必须从成员函数中删除类名称名称)在命令功能中很有用,可以在地图中注册函数,这样就可以避免拼写错误和额外打字。

(请注意,BOOST_CURRENT_FUNCTION可能是一个更便携的宏。)