我试图用boost::asio::spawn
协程重写一个项目。项目的某些部分无法更改。例如,存储协议库也使用boost::asio
编写,但没有协程。boost :: asio :: spawn yield作为回调
问题是如何将yield_context
转换为正常回调(boost::function
对象或经典仿函数)。
这是我们所拥有的存储库的API:
void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);
当我们从实例知道,ASIO产量上下文可以像这样使用:
my_socket.async_read_some(boost::asio::buffer(data), yield);
在这种情况下,boost::asio::yield_context
对象用作async_read_some的回调。我想通过一个收益对象作为async_request_data
的第二个参数,所以我可以以同步的方式使用它。
这怎么办?我认为这可能通过一些代理对象,可能使用基于asio_handler_invoke的方法。但是我很难看到如何做到这一点。
当然,我需要一些代理对象,把它作为回调,但其并不清楚怎么写这个对象的胆量。 'yield_context'没有'operator()'(othewise它会按原样“没有代理”)。它有一些这里描述的胆量http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context.html,但不清楚如何将它们结合起来做一个正确的协程简历。 – PSIAlt
我觉得** handler **是**代理对象。请参阅编辑。 –
它适用于一些小的变化!感谢指导! (我在另一个答案中发布了最终代码) – PSIAlt