如何在 C++ 中退出函数的 while 循环

how to exit a while loop through a function in C++

本文关键字:函数 while 循环 退出 C++      更新时间:2023-10-16

假设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 循环呢?

您有几个选择:

  1. 在退出函数中引发异常,并在 while 循环中捕获它。

  2. 让所有函数返回布尔值,无论是否退出 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位(之后可以再次清除)可能是更好的选择。