Как я могу заменить устаревший handler_type_t или boost :: asio :: handler_type в этом примере фрагмента кода? - PullRequest
1 голос
/ 01 февраля 2020

Я нашел эту интересную ссылку boost :: asio :: spawn yield в качестве обратного вызова

, и, поскольку это может быть тем, что мне нужно, я хотел попробовать следующую часть:

template <class CompletionToken>
auto async_foo(uint64_t item_id, CompletionToken&& token)
{

    typename boost::asio::handler_type< CompletionToken, void(error_code, size_t) >::type handler(std::forward<CompletionToken>(token));
    //handler_type_t<CompletionToken, void(error_code, size_t)>                        handler(std::forward<CompletionToken>(token));

    async_result<decltype(handler)> result(handler);

    //async_request_data(item_id, handler);

    return result.get();
}  

Но, очевидно, ни handler_type_t, ни boost::asio::handler_type больше не существует в более новой версии Boost.

Как я могу адаптировать пример?

РЕДАКТИРОВАТЬ:

Это он правильно? Вместо

boost::asio::handler_type< CompletionToken, void(error_code, size_t) >::type

я использовал

typename boost::asio::async_result< CompletionToken, void(error_code, size_t) >::completion_handler_type

1 Ответ

1 голос
/ 01 февраля 2020

Это почти правильно. из документов из boost.asio

Инициирующая функция определяет тип CompletionHandler объекта своей функции завершения обработчика, выполняя typename async_result<decay_t<CompletionToken>, Signature>::completion_handler_type

и

Инициирующая функция возвращает свой тип возврата следующим образом:

- создание результата объекта типа async_result<decay_t<CompletionToken>, Signature>, инициализированного как result(completion_handler); и

- с использованием result.get() в качестве операнда оператора return.

Итак, правильный способ адаптации примера будет

template <class CompletionToken>
auto async_foo(uint64_t item_id, CompletionToken&& token)
{

    typename boost::asio::async_result<std::decay_t<CompletionToken>, void(std::error_code, std::size_t)>::completion_handler_type
                    handler(std::forward<CompletionToken>(token));
    boost::asio::async_result<std::decay_t<CompletionToken>, void(std::error_code, std::size_t)> result(handler);

    async_request_data(item_id, handler);

    return result.get();
}
...