我应该如何在自己的函数中传递boost :: asio :: yield_context?

Emi*_*ier 4 c++ boost coroutine boost-asio c++11

我正在编写一个使用Boost.Asio的C++ 11网络库.我想公开一个允许用户使用堆栈协程的API.我应该如何接受boost::asio::yield_contextAPI函数中的参数?按价值?引用?通过const引用?我不知道这些yield_context对象要复制多贵.

例如:

Result remoteProcedureCall(Args args, boost::asio::yieldcontext yield)
//                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ How to pass?
Run Code Online (Sandbox Code Playgroud)

我知道我可以采用通用参考并完成转发:

template <typename TYield>
Result remoteProcedureCall(Args args, TYield&& yield)
{
    //...
    boost::asio::async_write(socket_, buffer, std::forward<TYield>(yield));
    //...
}
Run Code Online (Sandbox Code Playgroud)

但我希望我的API函数不是模板化的,因此我可以实现Pimpl习语.

seh*_*ehe 5

很有意义的是,上下文的生命周期与协程本身的生命周期相对应.

这意味着,我预计它包含指向实际(隐藏)实现状态的指针(或reference_wrapper).

也就是说,只需像Boost库本身那样做,即yield_context按值获取对象.