2012-03-16 20 views
5

假設我們需要一個返回值的函數。但是那東西可能找不到。我看到的選項:使用boost :: tuple <bool, T>來表示T是否被找到是否好?

1. T find(bool &ok); //return default T value if not found 

我們可以做一個結構:

template <typename T> 
class CheckableValue 
{ 
public: 
    CheckableValue(), 
    _hasValue(false) 
    { 

    } 
    CheckableValue(const T &t): 
    _value(t), 
    _hasValue(true) 
    { 

    } 

    inline bool hasValue() const {return _hasValue} 
    const T &value() const 
    { 
     assert(hasValue()); 
     return _value; 
    } 

private: 
    T _value; 
    bool _hasValue; 
}; 

,使功能:

2. CheckableValue<T> find(); 

或者我們可以使用:

3.boost::tuple<bool, T> find() 

怎麼辦你認爲是可取的?

回答

13

我喜歡:

4. boost::optional<T> find(); 

與元組的問題是,T部分是無效的,當bool部分是假的;這個行爲不是由元組強制執行的。對於相同的問題,您的CheckableValue類與boost::optional的解決方法相同。

+1

boost可選http://www.boost.org/doc/libs/1_41_0/libs/optional/doc/html/index.html真的很棒。我在許多看起來像海報的地方使用它。 – 2012-03-16 09:47:21

0

返回一些東西。但是那東西可能找不到。

你實際上是否計劃退回一個副本或某種參考的東西? 「找不到」意味着該功能通過在某個數據結構中「查找」預先存在的值來工作。

在這種情況下,簡單的解決方案是返回一個指向現有值的指針,使用NULL作爲未找到的。

+1

它不一定需要在某些集合中。該值可以在旅途中計算並返回。但是如果某些輸入不正確,可能會產生一個標誌,表示輸入錯誤。返回指向剛剛分配給堆對象的指針並不方便,我想(你可能會說auto_ptr會完成這項工作,但我認爲boost :: optional會好得多) – Andrew 2012-03-16 09:46:20

相關問題