我正在编写一个使用Boost.Asio的C ++ 11网络库。我想公开一个允许用户使用堆栈协程的API。我应该如何接受API函数中的boost::asio::yield_context
参数?按价值?引用?通过const引用?我不知道这些yield_context
对象要复制多贵。
例如:
Result remoteProcedureCall(Args args, boost::asio::yieldcontext yield)
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ How to pass?
我知道我可以采用通用参考并完成转发:
template <typename TYield>
Result remoteProcedureCall(Args args, TYield&& yield)
{
//...
boost::asio::async_write(socket_, buffer, std::forward<TYield>(yield));
//...
}
但我希望我的API函数不是模板化的,这样我就可以实现Pimpl习语。
答案 0 :(得分:5)
很有意义的是,上下文的生命周期与协程本身的生命周期相对应。
这意味着,我预计它包含指向实际(隐藏)实现状态的指针(或reference_wrapper)。
那就是说,就像Boost库本身那样做,就是按值取yield_context
对象。