簡體   English   中英

返回值是常量引用時如何返回“未找到”

[英]How to return "not found" when return value is const reference

我有一個問題,當我使用這樣的東西時:

const MyList& my_list = getListForThisRegion(/*region ID, ...*/);

當找不到值時,我不知道返回什么。

我的問題是我想有一種方法來向調用者發出信號(當從getListForThisRegion返回值時)“未找到值”。 如果我返回一個指針,我可以返回nullptr ,但我不知道如何使用引用來做到這一點。 所有我能想到的是有一些靜態成員not_foundMyList ,並把它返回一個參考,但似乎丑陋。

是的,我無法返回值,因為列表是“胖”的並且經常使用。

編輯:很多很好的答案,但異常不是一個可以接受的解決方案,因為它被引發的次數很高( nbNotFound/nbCalls的百分比很高)。
EDIT2:關於 boost::optional - 掌握有多復雜? 我的意思是它是否需要一些不明顯的知識(不明顯=不僅僅是知道語法的東西)?

有兩種慣用的方法來處理這個問題:

  • 更改您的接口以返回一個可以不引用任何內容的類型(例如,可以為 null 的指針、指向end的迭代器)。

或者

  • 如果未找到該項目,則拋出異常。

返回一個虛擬對象有點笨拙,並且您不會通過返回指針獲得任何好處,因為您仍然必須根據特殊值(null 或虛擬對象)檢查結果。

如何重寫函數以引用您將列表返回的“returnValue”? 然后該函數可以返回指示找到/未找到的布爾值。

bool getListForThisRegion(/*region ID, ...*/, MyList& ret_list);

我會編寫異常類(層次結構,如果需要)並在這種情況下拋出異常。

我只看到兩種可能性:要么在 MyList 類中有一個特殊成員聲明實例為“null”(未設置),要么可以拋出異常。

您可以按照std::map的指導,在您的容器中插入一個默認構造的列表,並返回對該列表的引用。 顯然,這取決於默認列表和根本不存在的列表之間沒有語義差異。

您還可以添加一個查詢函數來搜索特定區域,如果有列表則返回 true,否則返回 false。 然后,您可以在訪問器保險箱中拋出異常,因為它不會經常發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM