Получить ссылку io_context из сокета в Boost 1.73+ Asio - PullRequest
1 голос
/ 07 мая 2020

Как мне получить boost::asio::io_context ссылку из сокета? Раньше были функции-члены socket::get_io_service, а затем socket::get_io_context, но теперь они обе устарели. Я нашел единственный способ сделать это в Boost 1.73 +:

boost::asio::ip::tcp::socket socket(...);
// ...
boost::asio::io_context& io_context = static_cast<boost::asio::io_context&>(socket.get_executor().context());

Это работает, но выглядит некрасиво и опасно. Есть способ лучше?

1 Ответ

2 голосов
/ 07 мая 2020

Вероятно, вы захотите получить исполнителя, который может быть чем-то другим, кроме io_context.

Там есть вызов get_executor(), чтобы сделать это напрямую:

boost::asio::io_context io;
boost::asio::ip::tcp::socket s(io);
auto ex = s.get_executor();

Исполнитель будет позволяют вам делать большинство вещей, которые вы, вероятно, использовали io_context для.

UPDATE

К комментарию, я НЕ рекомендую полагаться на точную цель исполнителя, которого вы передали через любой сервисный объект, но вы можете заставить свою руку, если действительно не хотите обновлять свой дизайн прямо сейчас:

Live On Coliru

#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);
}

При составлении операций asyn c вы можете получить исполнитель из обработчика, используя boost::asio::get_associated_executor()

...