簡體   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