如何在 C++ 中退出函数的 while 循环
how to exit a while loop through a function in C++
假设mf_ptr是一个类的成员函数指针的typedef。我们有流动的代码:
map<string, mb_ptr> cmd_table;
cmd_table["exit"] = &class_name::exit;
string cmd;
while (cin >> cmd){
(this->*cmd_table[cmd])();
}
那么我应该如何定义函数 exit() 来退出 while 循环呢?
您有几个选择:
-
在退出函数中引发异常,并在 while 循环中捕获它。
-
让所有函数返回布尔值,无论是否退出 while 循环。
你可以做这样的事情:
while (cin >> cmd && !class_name::exitLoop){
(this->*cmd_table[cmd])();
}
其中 class_name::exitLoop
将被设置为 true class_name::exit()
.
我个人会选择:
while(cin >> cmd && cmd != "exit") {
(this->*cmd_table[cmd])();
}
您可以使用(如上所述指定的方式):
class_name::exit(void) { cin.setstate(eofbit); ... }
...
while(cin >> cmd)
(this->*cmd_table[cmd])();
在这种情况下,循环将在处理exit
命令后终止(下一次迭代>>
将失败)。
如果要提高复杂性,可以创建自定义流提取运算符,
friend istream & operator>>(istream & is, class_name::CmdExecutorClass &comm)
{
string cmd;
cin >> cmd;
if (cmd == "exit")
cin.setstate(eofbit);
else
(comm.table[cmd])();
return is;
}
我可以看到的好处是你可以简单地写:
while (cin >> cmd);
您可以处理错误/未知命令(例如 如果键不存在元素,std::map<...>::operator[]
会添加到映射中 - 这可能不是您想要的)。
但是你还需要相当多的胶水来创建CmdExecutor
类(构造函数或模板从嵌入"master"类传递table[]
引用,...对于一个简单的案例,矫枉过正。
编辑:还应该添加关闭cin
(这就是设置eof
位所做的,有效地)也可能是不需要的。fail
位(之后可以再次清除)可能是更好的选择。
相关文章:
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- 在 while 循环中使用 pow() 函数 C++
- 为什么我的 while 函数没有终止?
- 有没有办法制作一个 c++ 宏(或类似的东西),它使用户语句被 while 循环的预定义函数包围?
- 为什么我不能将 size() 函数编写为 while 循环中的条件?
- 在C++中调用while循环内的函数时出错
- 为什么我在这个函数中的while循环出现问题
- 控制使用 while 循环到达非空函数 (c++) 的末尾
- 为什么当 while 循环中的 if 条件变为 false 时,我的函数不输出最后一条语句?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 简化 if 流函数的 while 循环中的大量 while 循环
- For 和 while 循环在全局定义的函数中不起作用
- 查找涉及 while 循环的运行时函数
- 带有文件结束函数的 while 循环重复输出文件中的最后一个数字两次
- C++创建一个类似于 while、if 或 for 的函数
- 是否有任何函数可用于在 c++ 编程中传输流程,以替代 while 或 do while 循环
- while 循环在一个函数调用中执行两次
- 返回类型 char* 的成员函数返回在 while 循环后包含不同字符串的地址
- 为什么我的 while 循环函数只返回"1"?
- c++函数while循环