繁体   English   中英

如何通过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循环?

您有几种选择:

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

  2. 让所有函数返回一个布尔值,无论是否退出while循环。

您可以执行以下操作:

while (cin >> cmd && !class_name::exitLoop){
    (this->*cmd_table[cmd])();
}

其中class_name::exitLoop将通过class_name::exit()设置为true。

我个人认为:

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位(稍后可以再次清除)可能是一个更好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM