C++ Boost asio库最新版本中缺少方法的替代方法
几年前,我使用Boost asio库编写了一个电子邮件客户端 有一个抽象类ICON,包含四个子类 POP3通信 POP3conS保护POP3通信 SMTPconN到平面SMTP通信 SMTPconS保护SMTP通信 图标有一个成员C++ Boost asio库最新版本中缺少方法的替代方法,c++,boost,boost-asio,C++,Boost,Boost Asio,几年前,我使用Boost asio库编写了一个电子邮件客户端 有一个抽象类ICON,包含四个子类 POP3通信 POP3conS保护POP3通信 SMTPconN到平面SMTP通信 SMTPconS保护SMTP通信 图标有一个成员 boost::asio::ip::tcp::socket socket_ 和两个虚拟过程,在每个子类中定义: void SMTPconN::run() { socket_.get_io_service().run(); } void SMTPconN::reset(
boost::asio::ip::tcp::socket socket_
和两个虚拟过程,在每个子类中定义:
void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
该应用程序在boost_1_63_0上运行良好。但当我尝试更新以提升_1_70_0时,编译器(MS V Studio 2015)对这两种定义都有抱怨:
class "boost::asio::ssl::stream<boost::asio::ip::tcp::socket>" has no member "get_io_service".
类“boost::asio::ssl::stream”没有成员“get\u io\u service”。
因为我想对大量的代码和复杂的逻辑进行最小的更改:对于这个遗漏的方法,是否有一些解决方法?文档状态下,您可以使用get\u context().context()
,这将为您提供一个io\u context
实例(它取代了boost 1.64/1.65 IIRC附近的io_服务
)
网络TS兼容性
Boost.Asio现在提供了“C++网络扩展”技术规范指定的接口和功能。除了通过常用的Boost.Asio头文件进行访问外,还可以通过与TS中定义的头文件相对应的特殊头文件访问此功能。下表列出了这些头文件:
[……]
使用get_executor().context()获取关联的io_上下文
get\u io\u service()
和get\u io\u context()
之前都是为了方便移植而准备的,但同时它们也被弃用和淘汰了
PS:还要看看哪一个与你的问题非常相似,但指定了一个特定的用例
这里的注释为该用例提供了明显更好的解决方案:
socket.get_io_service().post([](){ /* my custom code */ } );
变成
post(socket.executor(), [](){ /* my custom code */ } );
子类:POP3conN和SMTPconN有一个成员:
boost::asio::ip::tcp::socket socket_
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
类似地,POP3conS和SMTPconS也有一个成员:
boost::asio::ip::tcp::socket socket_
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_;
第一次更改:在抽象类中添加了一个新成员:
boost::asio::io_context* iocontPtr_;
在构造函数中初始化,替换对io\u服务的旧引用
:
IPCON::IPCON(boost::asio::io_context* iocont_, ...) { ... }
在构造函数中,已将子类的初始化添加到该成员:
POP3conN::POP3conN(boost::asio::io_context* iocont, ....) : IPCON(iocont) { ... }
第二次更改:所有发生的
boost::asio::io_service
可以用
boost::asio::io_context
有问题的表达
void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
现在显示如下:
void SMTPconN::run() { iocontPtr->run(); }
void SMTPconN::reset() { iocontPtr->reset(); }
似乎旧的io\u服务的功能已被新的io\u上下文所取代