C++ 从Boost 1.73+;中的套接字获取io#U上下文引用;阿西奥

C++ 从Boost 1.73+;中的套接字获取io#U上下文引用;阿西奥,c++,boost,boost-asio,C++,Boost,Boost Asio,如何从套接字获取boost::asio::io\u上下文引用?以前有socket::get_io_服务和socket::get_io_上下文成员函数,但现在它们都不推荐使用。我在Boost 1.73+中找到了实现这一点的唯一方法: boost::asio::ip::tcp::socket套接字(…); // ... boost::asio::io_context&io_context=static_cast(socket.get_executor().context()); 然而,这样做看起来

如何从套接字获取
boost::asio::io\u上下文
引用?以前有
socket::get_io_服务
socket::get_io_上下文
成员函数,但现在它们都不推荐使用。我在Boost 1.73+中找到了实现这一点的唯一方法:

boost::asio::ip::tcp::socket套接字(…);
// ...
boost::asio::io_context&io_context=static_cast(socket.get_executor().context());

然而,这样做看起来既丑陋又危险。有更好的方法吗?

您可能需要获取执行器,它可能不是io_上下文

有一个
get\u executor()
调用直接执行:

boost::asio::io_context io;
boost::asio::ip::tcp::socket s(io);
auto ex = s.get_executor();
执行器将允许您执行您可能使用
io\u上下文进行的大多数操作

使现代化 对于评论,我不建议依赖于通过任何服务对象传递的执行者的确切目标,但如果您现在确实不想更新您的设计,您可以强制执行:

#include <boost/asio.hpp>
int main() {
    boost::asio::io_context io;
    boost::asio::ip::tcp::socket s(io);

    auto ex = s.get_executor();

    auto* c = ex.target<boost::asio::io_context>();
    boost::asio::ip::tcp::socket more_sockets(*c);

    assert(c == &io);
}
#包括
int main(){
boost::asio::io\u上下文io;
boost::asio::ip::tcp::sockets(io);
auto ex=s.get_executor();
auto*c=ex.target();
boost::asio::ip::tcp::套接字更多\u套接字(*c);
断言(c==&io);
}

合成异步操作时,您可以使用
boost::asio::get_associated_executor()

不,我需要io_上下文,而不是executor。我需要io_上下文引用来构造另一个套接字,或一个串,或一个接受器,或从io_上下文引用构造的任何其他内容。很抱歉,如果此讨论开始超出原始问题:)我可以从执行器构造套接字、接受器和解析器-好的,没关系。然而,strand实例仍然需要构建io_上下文引用,而不是执行器。我会接受你的回答,但请你解释一下我应该如何处理绞线-我不想传递对套接字和io_上下文的引用,因为它有点多余-套接字已经“知道”了它的io_上下文。为什么依赖io_上下文引用的执行器是一个糟糕的设计?我想这里的逻辑概念是:不应该在某些“假定”上下文中动态实例化这些对象。特别是股线:它似乎是一种设计气味,以动态剥离股线。对于组合操作,可以使用
get_associated_executor
在与正在组合的处理程序关联的串上运行中间处理程序。我认为如果你是“为了谋生”而这样做的话,那么
boost::asio::async\u compose
可以让你的生活更轻松(我仍然应该了解更多)。现在,我可能会使用
make\u strand(sock.get\u excutor())
,这看起来非常像是相同的strand身份: