使用 boost::tuple<bool, T> 来表示是否找到了 T 是一个好的做法吗?

5
假设我们需要一个返回内容的函数。但是有可能找不到这个内容。我看到以下几个选项:
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()

你认为哪种更好?
2个回答

13

我更喜欢:

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

元组的问题在于当bool部分为false时,T部分无效;而元组并不强制执行此行为。您的CheckableValue类与boost::optional针对相同问题采用了相同的解决方案。


1
boost optional http://www.boost.org/doc/libs/1_41_0/libs/optional/doc/html/index.html 真的很棒。我在很多类似于帖子中的地方使用它。 - Carsten Greiner

0
返回某个东西。但是那个东西可能找不到。
你是否真的计划返回一个副本或某种引用?“未找到”意味着该函数通过在某个数据结构中“查找”预先存在的值来工作。
在这种情况下,简单的解决方案是返回指向现有值的指针,使用NULL表示未找到。

1
它不一定需要在某个集合中。该值可以在运行时计算并返回。但是,如果某些输入不正确,则可能会引发标志,指示错误的输入。我认为返回刚刚分配在堆上的对象的指针并不方便(你可能会说auto_ptr会完成这项工作,但我认为boost::optional更好)。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接