我应该如何在自己的函数中传递 boost::asio::yield_context ?
How should I pass a boost::asio::yield_context in my own functions?
我正在编写一个在后台使用 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 惯用法。
上下文的生命周期与协程本身的生命周期相对应,这很有意义。
这意味着,我预计它包含指向实际(隐藏)实现状态的指针(或 reference_wrapper)。
也就是说,就像Boost库本身做的那样,就是按值取yield_context
对象。
我正在编写一个在后台使用 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 惯用法。
上下文的生命周期与协程本身的生命周期相对应,这很有意义。
这意味着,我预计它包含指向实际(隐藏)实现状态的指针(或 reference_wrapper)。
也就是说,就像Boost库本身做的那样,就是按值取yield_context
对象。