C++ 在可能失败的函数中重试对象引用的最佳方法

C++ 在可能失败的函数中重试对象引用的最佳方法,c++,C++,我正在为队列编写一个小代码,允许您等待输入可用。 现在,std::queue有了front函数,它返回对top对象的引用,我希望采用类似的设计。 问题是,我想让选项等待X毫秒,输入才可用。这意味着我还必须返回一些关于等待的状态(比如,true表示成功,false表示超时)。我可以用两种方法来做: std::pair<bool, T&> frontWait(const std::chrono::milliseconds& timeout); 我也不太喜欢 也许我错过了

我正在为队列编写一个小代码,允许您等待输入可用。 现在,std::queue有了front函数,它返回对top对象的引用,我希望采用类似的设计。 问题是,我想让选项等待X毫秒,输入才可用。这意味着我还必须返回一些关于等待的状态(比如,true表示成功,false表示超时)。我可以用两种方法来做:

std::pair<bool, T&> frontWait(const std::chrono::milliseconds& timeout);
我也不太喜欢

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

< P>你可以考虑。

你可能需要考虑。


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

我记得,它的工作原理如下:

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

auto response = frontWait(1000);
if(response) dosomething(response.get());
可选的frontWait(常数std::chrono::毫秒和超时)
自动响应=前等待(1000);
if(response)dosomething(response.get());

检查Boost可选功能。你不需要使用它。如果需要,您可以实现自己的

我记得,它的工作原理如下:

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

auto response = frontWait(1000);
if(response) dosomething(response.get());
可选的frontWait(常数std::chrono::毫秒和超时)
自动响应=前等待(1000);
if(response)dosomething(response.get());

您缺少一个显而易见的解决方案:返回指针而不是引用。空指针表示操作未成功


我不是在提倡其他技术,但这是过去的做法。

您缺少一个明显的解决方案:返回指针而不是引用。空指针表示操作未成功


我不是在提倡其他技术,但这是旧时代的做法。

那么
bool-frontWait(const-std::chrono::millists&timeout,T&result)呢?
?或者不返回引用,而是返回一个指针,该指针可以是
nullptr
。我可以将结果设置为对实际前端对象的引用,而不是将对象复制到结果中吗?啊,我明白了。当然,我的第一个建议不是这样,尽管您可以将参数类型更改为
T*&
T**
。那么
bool-frontWait(const-std::chrono::microsides&timeout,T&result)呢?或者不返回引用,而是返回一个指针,该指针可以是
nullptr
。我可以将结果设置为对实际前端对象的引用,而不是将对象复制到结果中吗?啊,我明白了。我的第一个建议不是这样的,当然,尽管您可以将参数类型更改为
T*&
T**
。我最终实现了一个类似的可选类,但您提出的第二个解决方案并不适合,因为我希望返回对象的引用,而不是它的副本。谢谢@莫谢马涅斯:不客气。作为一个好的Stackoverflow公民,您可能希望对所有您认为有用的回复进行投票,并将最好的一个标记为答案。我最终实现了一个类似的可选类,您提出的第二个解决方案并不真正适合,因为我希望返回对象的引用,而不是它的副本。谢谢@莫谢马涅斯:不客气。作为一个好公民,你可能想对所有你认为有用的回复进行投票,并将最好的一个标记为答案。
optional<T&> frontWait(const std::chrono::milliseconds &timeout)

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