我想创建一个异步函数,它将最后一个参数boost :: asio :: yield_context作为参数。例如: -如何将error_code设置为asio :: yield_context
int async_meaning_of_life(asio::yield_context yield);
我也想与短耳如何返回错误代码是一致的。也就是说,如果用户确实:
int result = async_meaning_of_life(yield);
和函数调用失败,则抛出system_error
例外。但是,如果用户确实:
boost::error_code ec;
int result = async_meaning_of_life(yield[ec]);
然后 - 而不是抛出 - 在ec
返回错误。
问题是,当实现该功能时,我似乎无法找到一个干净的方法来检查是否使用了operator [],并且如果是这样的话就设置它。我们想出了这样的事情:
inline void set_error(asio::yield_context yield, sys::error_code ec)
{
if (!yield.ec_) throw system_error(ec);
*(yield.ec_) = ec;
}
但是,这是哈克,因为yield_context::ec_
是declared private(虽然只在文档中)。
我能想到的另一种方法是将yield
对象转换为asio::handler_type
并执行它。但是这个解决方案看起来好像很尴尬。
还有别的办法吗?
谢谢@sehe,但这是“将yield对象转换为'asio :: handler'”解决方案,我在这个问题。我没有试图创建一个支持处理程序,期货和协同程序的通用异步函数。恰恰相反,为了代码清晰,我试图尽可能长时间地使用协程。 –
想想这个答案是为了确认你的恐惧吗?你希望做的事情会一直呆在尴尬的地方,直到有人出现新的信息(或者API库被扩展)。 – sehe
抱歉,延迟。我认为如果你修改你的答案,明确提到某个地方在目前是不可能的,我会很乐意将它标记为答案,直到有人证明我们错了。 –