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

时间:2019-05-20 17:06:34

标签: c++ boost boost-asio

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

有一个带有三个子类的虚拟类 ICON

POP3conN 到平面POP3通信

POP3conS 以保护POP3通信

SMTPconN 到平面SMTP通信

SMTPconS 以保护SMTP通信

图标有一个成员

boost::asio::ip::tcp::socket socket_

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

void SMTPconN::run() { socket_.get_io_service().run(); }
void SMTPconN::reset() { socket_.get_io_service().reset(); }

该应用程序在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".

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

2 个答案:

答案 0 :(得分:4)

文档在Networking TS compatibility下声明您可以使用get_context().context(),这将为您提供一个io_context实例(它在增强IIRC 1.64 / 1.65 IIRC附近替换了io_service)。

  

网络TS兼容性

     

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

     

[...]

     

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

get_io_service()get_io_context()以前都是为了方便移植而设计的,但与此同时,它们也已被弃用和废弃。

PS:另请参见Get boost::asio::io_context from a boost::asio::ip::tcp::socket to exec a custom function,与您的问题极为相似,但指定了特定的用例。

该评论针对该用例具有 确定更好的解决方案

socket.get_io_service().post([](){ /* my custom code */ } );

成为

post(socket.executor(), [](){ /* my custom code */ } );

答案 1 :(得分:0)

子类: POP3conN SMTPconN 具有成员:

boost::asio::ip::tcp::socket socket_

类似地, POP3conS SMTPconS 具有成员:

boost::asio::ssl::stream<boost::asio::ip::tcp::socket>  socket_;

所有构造函数的第一个参数是指向io_service的指针。像这样:

IPCON::IPCON(boost::asio::io_service* ioserv_, ...) { ... }

POP3conN::POP3conN(boost::asio::io_service* ioserv_, ....) {...}

首次更改:在抽象类 IPCON 中添加了新成员:

boost::asio::io_context* iocontPtr_;

wich在构造函数中初始化,替换了对io_service的旧引用:

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_service的功能已被新的io_context取代。