簡體   English   中英

我應該使用什么函數簽名來返回對可能不存在的對象的引用?

[英]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個選項:

  1. 返回一個“包裝器”對象,該對象可以轉換為V&並可以告訴它是否存儲有效的引用(可以在V *周圍實現)。
  2. 返回一個指針。
  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.

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