![](/img/trans.png)
[英]What should the return type be when the function might not have a value to return?
[英]What function signature should I use to return a reference to an object that might not exist?
我正在用C ++寫一個簡單的容器類,類似於存儲由鍵索引的對象的地圖。 我想提供一個訪問器功能,例如:
V& getValue(const K &key);
在這里我返回對值的引用 。
但是我還想處理鍵/值不存在並且能夠向用戶返回某些狀態的情況(可能由於某些原因,我不希望通過某種狀態類型與主叫方進行通訊) )。
我想我可以做下面的事情,但是調用它需要在調用該函數之前構造一個V對象,並且我只是將內部V對象復制到通過引用傳遞的那個V對象中,所以這似乎很糟糕。
Status getValue(const K &key, V& v);
我也可以這樣做:
V &getValue(const K &key, Status &s);
但是由於某種原因,當狀態從焦點上移開時,似乎有些笨拙,用戶可能會忘記檢查它(但這也許不是我的問題)。
所以無論如何都有類似的功能
Status getValue(const K &key, V& v);
不需要在調用之前構造偽V對象? 您不能將參考傳遞給參考。 我想我可以使用指針,並且很高興這樣做,但是創建一個簡單易用的函數並提出其理由並不那么理想。
有什么想法嗎?
通常的解決方案是提供一個bool contains(const K &key)
函數,如果您不希望訪問器以靜默方式創建條目,請使其拋出異常。 (具有兩個訪問器,一個訪問器引發異常,另一個訪問器創建條目也是常見的)
當然,這可能不是您想要的。 您想將所有這些都整合到一個函數中的原因是什么?
您可以使用原始函數V& getValue(const K &key)
,並引發異常以指示不成功的Status
值。
然后,調用者可以選擇延遲處理問題的方式(通過讓異常冒泡給適當的處理程序),但是他們不能徹底忘記它,因為否則程序將崩潰。 呼叫站點不必充斥狀態檢查和錯誤報告代碼。
如果不想使用boost,我會使用boost::optional
或創建一個類似的模板。 使用boost::optional
您的函數將如下所示:
boost::optional<MyClass &> getValue(const K &key)
我看到3個選項:
我個人會帶一個指針。
考慮返回boost::variant<V &, Status>
或(等效地) boost::variant<std::reference_wrapper<V>, Status>
。
我會遵循std :: map接口的想法:
std::pair<iterator,bool> getValue(const K& key);
可通過迭代器訪問值對象, bool
標志顯示值是否存在。
首先,我將以書面形式回答您的問題:我建議您返回boost::optional<boost::ref<V> >
以便您仍然可以按引用返回,但是可以選擇這樣返回。
但是,我不建議使用此界面。 標准容器已經具有解決此問題的接口,即返回迭代器而不是值。 我建議僅使用“迭代器”界面(它不一定是真正的成熟迭代器),並在end
返回一個end
/一個以指示未找到該迭代器,而不是通過引用或不返回。 您使容器的界面看起來像標准容器的次數越多,使用標准算法並將其插入到您想要替代的任何位置的選擇就越多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.