这是期货的实施限制。
Modern async_result<>
专业化(使用initiate
成员方法)可以与as_tuple
, e.g.:
ba::awaitable<std::tuple<boost::system::error_code, size_t>> a =
ba::async_read(m_socket, buffer, ba::as_tuple(ba::use_awaitable));
或者,更典型的是:
auto [ec, n] = co_await async_read(m_socket, buffer, ba::as_tuple(ba::use_awaitable));
然而,相应的:
auto future = ba::async_read(m_socket, buffer, ba::as_tuple(ba::use_future));
目前不支持。可以说可以,但你必须创建自己的完成令牌,或者要求 Asio 开发人员添加支持use_future
: https://github.com/chriskohlhoff/asio/issues https://github.com/chriskohlhoff/asio/issues
旁注:如果您构建m_socket
来自m_sessioStrand
执行人,您不需要bind_executor
到股:
using Executor = net::io_context::executor_type;
struct Session {
int32_t read(unsigned char* pBuffer, uint32_t bufferSizeToRead);
net::io_context m_ioc;
net::strand<Executor> m_sessionStrand{m_ioc.get_executor()};
tcp::socket m_socket{m_sessionStrand};
};