Я пытаюсь переписать проект, используя boost::asio::spawn
сопрограммы. Некоторые части проекта не могут быть изменены. Например, библиотека протокола хранения также записывается с помощью boost::asio
, но без сопрограмм.
Проблема заключается в том, как преобразовать yield_context
в нормальный обратный вызов (объект boost::function
или классический функтор).
Это то, что мы имеем в API библиотеки хранения:
void async_request_data(uint64_t item_id, boost::function< void(Request_result *) > callback);
Как мы знаем из примеров, контекст вывода asio можно использовать следующим образом:
my_socket.async_read_some(boost::asio::buffer(data), yield);
В этом случае объект boost::asio::yield_context
служит для обратного вызова для async_read_some. Я хотел бы передать объект yield в качестве второго аргумента async_request_data
, поэтому я могу использовать его синхронно.
Как это можно сделать? Я думаю, что это возможно с помощью некоторого прокси-объекта, возможно, используя подход, основанный на asio_handler_invoke. Но я не могу понять, как это сделать.