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

How should I pass a boost::asio::yield_context in my own functions?

本文关键字:boost asio yield context 我自己 函数 自己的 我应该      更新时间:2023-10-16

我正在编写一个C++11网络库,它在引擎盖下使用Boost.Asio。我想公开一个允许用户使用堆叠协程的 API。我应该如何在 API 函数中接受 boost::asio::yield_context 参数?按价值?通过参考?通过常量引用?我不知道复制这些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对象。