c++ - 如何通过我自己的函数传递 boost::asio::yield_context?
问题描述
给定一个协程生成到..
void my_coroutine(asio::yield_context yield) {
system::error_code ec;
my_wrapper(yield[ec]);
if (ec) {
// something went wrong
return;
}
...
}
void my_wrapper(asio::yield_context&& yield) {
asio::async_read(..., yield); // any asio async call
if (ec) {
// something went wrong
return;
}
...
}
在包装函数中,无法从传递的 yield 上下文中访问 ec。那么如何解决呢?
解决方案
你想/做什么/用ec
?您可以访问的方式与您的 my_coroutine 已经显示的方式完全相同:
void my_wrapper(asio::yield_context&& yield) {
system::error_code ec;
asio::async_read(..., yield[ec]); // any asio async call
if (ec) {
// something went wrong
return;
}
...
}
如果您的意思是要进行可组合的异步操作,请参阅以下模式:
基本示例:
template <typename Token>
auto async_meaning_of_life(bool success, Token&& token)
{
#if BOOST_VERSION >= 106600
using result_type = typename asio::async_result<std::decay_t<Token>, void(error_code, int)>;
typename result_type::completion_handler_type handler(std::forward<Token>(token));
result_type result(handler);
#else
typename asio::handler_type<Token, void(error_code, int)>::type
handler(std::forward<Token>(token));
asio::async_result<decltype (handler)> result (handler);
#endif
if (success)
handler(error_code{}, 42);
else
handler(asio::error::operation_aborted, 0);
return result.get ();
}
推荐阅读
- javascript - Jquery step插件从ajax成功进入下一步
- javascript - 一个大函数中的 Javascript 多个函数?
- javascript - 粘性标题 - 使用标签滚动
- java - 从 Azure AD Java 获取访问令牌
- javascript - 如何正确显示警报,以便单击“返回”后自动关闭
- sql-server - 连接唯一值 SQL Server
- android - 如何根据数据计数添加textview和editText
- javascript - 我需要让我的应用程序端的更多用户能够从所有这些用户的其他应用程序接收数据
- amazon-web-services - AWS AMI 名称的最大长度是多少?
- java - 比较Java中的两组对象