[英]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
將通過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.