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

标签 c++ c++11 boost boost-asio coroutine

我正在编写一个在底层使用 Boost.Asio 的 C++11 网络库。我想公开一个允许用户使用堆栈协程的 API。我应该如何在我的 API 函数中接受 boost::asio::yield_context 参数?按值(value)?引用?通过 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 对象。

关于c++ - 我应该如何在我自己的函数中传递 boost::asio::yield_context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27972566/

相关文章:

c++ - 如何在 Linux 上强制执行 vector 下标超出范围调试断言

c++ - 对象的代理,适当的 const 限定和缺乏

c++ - 使用 googletest 将 C++ 代码单元测试到 Zephyr

c++ - Boost::Regex 在长表达式不匹配时抛出错误

python - 在 VS2013 中构建/包含 Boost.Python

c++ - 我动态添加了一个按钮,我如何在 Qt 中的另一个空白中使用这个按钮?

c++ - 通过重载进行部分模板特化

c++ - 这是我想使用 "using"的情况吗?

c++ - 左值引用类型成员的用户定义 move 构造函数

c++ - 使用不同类型 boost program_options 值