在可能失败的函数中返回对象引用的最佳方法

时间:2014-04-14 20:39:06

标签: c++

我正在处理一个允许您等待输入可用的队列的小代码。 现在,std :: queue有前面的函数,它返回对顶层对象的引用,我想坚持类似的设计。 问题是,我想允许选项等待X毫秒的输入可用。这意味着我还必须返回一些关于等待的状态(假设成功为真,超时为假)。我可以用两种方式做到:

std::pair<bool, T&> frontWait(const std::chrono::milliseconds& timeout);
由于某种原因,我真的不喜欢它,它与其他功能签名真的不同,后者要么返回T&amp;,bool,要么什么都没有。 或者我可以有类似的东西:

T& frontWait(const std::chrono::milliseconds& timeout, bool& waitResult);

我也不喜欢。

也许我错过了一种方法? (在超时时抛出异常对我来说听起来不错,因为它根本不是一个例外),如果没有,哪种方法会更好?

3 个答案:

答案 0 :(得分:2)

您可能需要考虑boost::optional<>

boost::optional<T&> frontWait(const std::chrono::milliseconds& timeout);

在通话现场:

boost::optional<T&> result = frontWait(500);
if (result) {
    // Note the syntax similar to pointers, but boost::optional is not a pointer,
    // as you can read from its documentation.
    // Assume that doSomething has a prototype something like this:
    //   void doSomething(const T& x);
    // or:
    //   void doSomething(T& x);
    //
    doSomething(*result);
}

如果出于某种原因,你不想使用boost::optional,我认为另一个好的选择可以是简单的bool返回,当结果值通过引用参数返回给调用者时:

bool frontWait(const std::chrono::milliseconds& timeout, T& result);

答案 1 :(得分:1)

查看Boost Optional。你不需要使用它。如果需要,你可以实现自己的。

我记得,它的工作方式如下:

optional<T&> frontWait(const std::chrono::milliseconds &timeout)

auto response = frontWait(1000);
if(response) dosomething(response.get());

答案 2 :(得分:1)

您错过了明显的解决方案:返回指针而不是引用。空指针意味着操作没有成功。

我并不是在提倡其他技术,而是过去在过去做的事情。