【发布时间】:2021-11-15 17:04:05
【问题描述】:
我目前正在尝试将新的 C++20 协程与 boost::asio 一起使用。但是,我正在努力找出如何实现自定义等待函数(例如 boost::asio::read_async)。我要解决的问题如下:
我有一个连接对象,我可以在其中发出多个请求并为响应注册回调。不能保证响应按照请求的顺序到达。我尝试用自定义的可等待对象包装回调,但是我无法在协程中 co_await 这个,因为我的可等待类型在 boost::asio::awaitable 中没有 await_transform。
我试图将回调包装成可等待的代码改编自这里: https://books.google.de/books?id=tJIREAAAQBAJ&pg=PA457
auto async_request(const request& r)
{
struct awaitable
{
client* cli;
request req;
response resp{};
bool await_ready() { return false; }
void await_suspend(std::coroutine_handle<> h)
{
cli->send(req, [this, h](const response& r)
{
resp = r;
h.resume();
});
}
auto await_resume()
{
return resp;
}
};
return awaitable{this, r};
}
我尝试像这样调用 boost 协程:
boost::asio::awaitable<void> network::sts::client::connect()
{
//...
auto res = co_await async_request(make_sts_connect());
//...
}
给我以下错误:
error C2664: 'boost::asio::detail::awaitable_frame_base<Executor>::await_transform::result boost::asio::detail::awaitable_frame_base<Executor>::await_transform(boost::asio::this_coro::executor_t) noexcept': cannot convert argument 1 from 'network::sts::client::async_request::awaitable' to 'boost::asio::this_coro::executor_t'
有没有办法实现这个功能?
【问题讨论】:
标签: c++ boost c++20 asio c++-coroutine