最新版本的Boost asio库中缺少方法的替代方法

Old*_*bie 1 c++ boost boost-asio

几年前,我使用Boost asio库编写了一个电子邮件客户端。

有一个带有四个子类的抽象类ICON

POP3conN 到平面POP3通信

POP3conS 可确保POP3通信的安全

SMTPconN 到平面SMTP通信

SMTPconS 保护SMTP通信安全

ICON有一个会员

boost::asio::ip::tcp::socket socket_
Run Code Online (Sandbox Code Playgroud)

和两个虚拟过程,在echa子类中定义:

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }
Run Code Online (Sandbox Code Playgroud)

该应用程序在boost_1_63_0上运行良好。但是,当我尝试更新到boost_1_70_0时,编译器(MS V Studio 2015)在这两个定义中都抱怨:

class "boost::asio::ssl::stream<boost::asio::ip::tcp::socket>" has no member "get_io_service".
Run Code Online (Sandbox Code Playgroud)

因为我想对大量的代码和复杂的逻辑进行最小的更改:此遗漏方法是否有解决方法?

seh*_*ehe 6

docs 指出您可以使用Networking TS兼容性get_context().context()它将为您提供一个io_context实例(已io_service在boost 1.64 / 1.65 IIRC附近替换了一个实例)。

网络TS兼容性

Boost.Asio现在提供“网络的C ++扩展”技术规范指定的接口和功能。除了通过普通的Boost.Asio头文件进行访问之外,还可以通过与TS中定义的头文件相对应的特殊头来访问此功能。这些在下表中列出:

[...]

使用get_executor()。context()获得关联的io_context。

两者get_io_service()get_io_context()以前都在方便移植的地方,但与此同时,它们也已被弃用和废弃。

PS:另请参见从boost :: asio :: ip :: tcp :: socket获取boost :: asio :: io_context以执行自定义功能,该功能与您的问题极为相似,但指定了特定的用例。

那里的评论针对该用例具有绝对更好的解决方案

socket.get_io_service().post([](){ /* my custom code */ } );
Run Code Online (Sandbox Code Playgroud)

成为

post(socket.executor(), [](){ /* my custom code */ } );
Run Code Online (Sandbox Code Playgroud)