如何结合C++20协程使用带多签名的Asio concurrent_channel
关于Boost.Asio多签名通道的问题与示例需求
问题背景
根据concurrent_channel的文档说明:
通道支持的消息集由其模板参数指定
这意味着通道可支持多种消息类型。concurrent_channel参考文档中的typename... Signatures参数就是用来指定多组参数的位置。
我参照现有示例尝试添加多个签名,代码如下:
using my_channel = channel< void(boost::system::error_code, std::size_t), // 仅该签名时可正常运行,来自示例代码 void(std::string, float) // 添加该签名后出现大量编译错误 >;
但所有类似尝试都会在async_receive()和async_send()调用处引发大量编译错误(部分错误提及payload_type,概念上能理解但未在文档中找到相关说明)。
核心需求
求一份带C++20协程的可用多签名通道示例?
(使用union/variant/any传递数据不符合我的需求。我知道自己混用了channel和concurrent_channel,但两者应适用同一解决方案。)
补充疑问
在测试通道时,我发现若不将error_code作为第一个参数,程序会出错。这一点是否有文档记录?仅使用void()签名时程序可正常运行,正如某示例所示。更令人困惑的是,某可用示例中发送了error_code,但接收时却不处理该参数:
using token_channel = channel<void(boost::system::error_code, std::size_t)>; ... co_await tokens.async_send( boost::system::error_code{}, bytes_per_token, use_awaitable); ... // 为何接收时无需处理error_code? std::size_t bytes_available = co_await tokens.async_receive(use_awaitable);
内容的提问来源于stack exchange,提问作者JimB
相关产品推荐
相关产品推荐

