我在C ++中创建命令提示符。我希望用户输入诸如“说些什么”之类的行。然后将其拆分,以便“说”将是命令名称,“某事物”将是参数。到目前为止,这很好 - 这已经有效了。
然后我想使用命令的名称来调用适当的方法。我可以使用某种查找表但是有更好的方法吗?
答案 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::function
和boost::bind
。
另请注意,您可能会发现编译器宏__FUNCTION__
(在编译时扩展为当前函数的未修饰名称,并且通常用于错误消息中 - 您可能必须从成员函数中删除类名称名称)在命令功能中很有用,可以在地图中注册函数,这样就可以避免拼写错误和额外打字。
(请注意,BOOST_CURRENT_FUNCTION
可能是一个更便携的宏。)