C++ 如何通过C++;
让我们假设mf_ptr是类的成员函数指针的typedef。我们有流动的代码:C++ 如何通过C++;,c++,map,function-pointers,C++,Map,Function Pointers,让我们假设mf_ptr是类的成员函数指针的typedef。我们有流动的代码: map<string, mb_ptr> cmd_table; cmd_table["exit"] = &class_name::exit; string cmd; while (cin >> cmd){ (this->*cmd_table[cmd])(); } map cmd_表; cmd_table[“exit”]=&class_name::exit; 字符串cmd;
map<string, mb_ptr> cmd_table;
cmd_table["exit"] = &class_name::exit;
string cmd;
while (cin >> cmd){
(this->*cmd_table[cmd])();
}
map cmd_表;
cmd_table[“exit”]=&class_name::exit;
字符串cmd;
while(cin>>cmd){
(此->*cmd_表[cmd])();
}
那么我应该如何定义函数exit()来退出while循环呢?您有几个选项:
您有几个选择:
您可以这样做:
while (cin >> cmd && !class_name::exitLoop){
(this->*cmd_table[cmd])();
}
其中class\u name::exitLoop
将由class\u name::exit()
设置为true
我个人认为:
while(cin >> cmd && cmd != "exit") {
(this->*cmd_table[cmd])();
}
您可以这样做:
while (cin >> cmd && !class_name::exitLoop){
(this->*cmd_table[cmd])();
}
其中class\u name::exitLoop
将由class\u name::exit()
设置为true
我个人认为:
while(cin >> cmd && cmd != "exit") {
(this->*cmd_table[cmd])();
}
您可以使用(如上指定的方式):
在这种情况下,循环将在处理exit
命令后终止(下一轮>
迭代将失败)
如果您想获得更大的复杂性,可以创建一个自定义流提取操作符
我看到的优点是,你可以简单地写:
while (cin >> cmd);
您还可以处理错误/未知命令(例如,如果键不存在元素,则std::map::operator[]
将添加到映射中-这可能不是您想要的)。但是创建
CmdExecutor
类还需要一些胶水(从嵌入的“master”类传入表[]
引用的构造函数或模板,…)。对于一个简单的例子,过度杀戮
编辑:还应添加关闭cin
(这是eof
位的有效设置)可能也是不需要的。fail
位(之后可以再次清除)可能是一个更好的选择。您可以使用(按照上面指定的方式):
在这种情况下,循环将在处理exit
命令后终止(下一轮>
迭代将失败)
如果您想获得更大的复杂性,可以创建一个自定义流提取操作符
我看到的优点是,你可以简单地写:
while (cin >> cmd);
您还可以处理错误/未知命令(例如,如果键不存在元素,则std::map::operator[]
将添加到映射中-这可能不是您想要的)。但是创建
CmdExecutor
类还需要一些胶水(从嵌入的“master”类传入表[]
引用的构造函数或模板,…)。对于一个简单的例子,过度杀戮
编辑:还应添加关闭
cin
(这是eof
位的有效设置)可能也是不需要的。fail
位(之后可以再次清除)可能是一个更好的选择。您真的想为函数选择其他名称--exit
是标准库的一部分。这不是对ure问题的回答,所以我要做一个注释:我个人会选择:while(cin>>cmd&&cmd!=“exit”){(此->*cmd_表[cmd])();}@JerryCoffin exit是这里的一个成员函数,我认为我们不需要其他名称。@NadirMuzaffar也许你给出了最好的答案,虽然它不是我问题的答案。非常感谢!你真的想为函数选择其他名称--exit
是标准库的一部分。这不是对你问题的回答,所以我很抱歉给它一个评论:我个人会使用:while(cin>>cmd&&cmd!=“exit”){(这个->*cmd_表[cmd])()}@JerryCoffin exit是这里的一个成员函数,我认为我们不需要另一个名称。@NadirMuzaffar也许你给出了最好的答案,认为这不是我问题的答案。非常感谢!另一个选项是传入一个指向布尔值的指针,让函数在exit时设置它。这太糟糕了,但有时这就是答案。非常感谢h!另一个注意事项-只需创建一个boolcmd\u调度程序(istream&cmd\u in)
并调用while(cmd\u调度程序(cin))
…另一个选项是传入一个指向布尔值的指针,让函数在退出时设置它。这太糟糕了,但有时这就是答案。非常感谢!另一个注意事项是-只需创建一个bool cmd_调度程序(istream&cmd_in)
并调用while(cmd_dispatcher(cin));
…我投赞成票,因为你的答案很有帮助。但是..你的第一种方法可能在这里获得最好的效率,但是exit()只在while循环的条件为cin>>cmd时有效,这并不明显。在你的第二种方法中,“>>”操作符完成了我们预期>>不会完成的工作,这是危险的。而(cin>>cmd)迈克:我实际上同意你所做的所有观点。个人认为,流插入/提取算子是C++的一种癌症(“…………代码> <代码> > >我们不期望代码< > >代码>做……”。我承认,我只是把这看作是“你能做到多紧凑”的挑战之一。我投赞成票,因为你的答案很有帮助。但是..你的第一种方法可能在这里获得最好的效率,但是exit()只在while循环的条件为cin>>cmd时有效,这并不明显。在第二种方法中,“>>”操作符完成了我们预期>>无法完成的工作,这很危险。和while(cin>>cmd);迈克:我真的同意你说的所有观点。我个人认为流插入/提取算子是C++的一个癌症(“…………代码> > /代码>我们的工作是什么?