我正在处理一个允许您等待输入可用的队列的小代码。 现在,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);
我也不喜欢。
也许我错过了一种方法? (在超时时抛出异常对我来说听起来不错,因为它根本不是一个例外),如果没有,哪种方法会更好?
答案 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)
您错过了明显的解决方案:返回指针而不是引用。空指针意味着操作没有成功。
我并不是在提倡其他技术,而是过去在过去做的事情。