Как передать boost :: asio :: yield_context через мою собственную функцию? - PullRequest
2 голосов
/ 28 февраля 2020

С учетом появления сопрограммы в ..

void my_coroutine(asio::yield_context yield) {
    system::error_code ec;
    my_wrapper(yield[ec]);
    if (ec) {
        // something went wrong
        return;
    }
    ...
}

void my_wrapper(asio::yield_context&& yield) {
    asio::async_read(..., yield);  // any asio async call
    if (ec) {
        // something went wrong
        return;
    }
    ...
}

В функции-обертке невозможно получить доступ к e c из переданного контекста yield. Так как это можно решить?

1 Ответ

0 голосов
/ 28 февраля 2020

Что вы хотите / делать / с ec? Вы МОЖЕТЕ получить доступ точно так же, как уже показывает ваша my_coroutine:

void my_wrapper(asio::yield_context&& yield) {
    system::error_code ec;
    asio::async_read(..., yield[ec]);  // any asio async call
    if (ec) {
        // something went wrong
        return;
    }
    ...
}

Если вы хотите выполнить асинхронную c операцию, которая является составной, см. Этот шаблон:

Basi c пример:

template <typename Token>
auto async_meaning_of_life(bool success, Token&& token)
{
#if BOOST_VERSION >= 106600
    using result_type = typename asio::async_result<std::decay_t<Token>, void(error_code, int)>;
    typename result_type::completion_handler_type handler(std::forward<Token>(token));

    result_type result(handler);
#else
    typename asio::handler_type<Token, void(error_code, int)>::type
                 handler(std::forward<Token>(token));

    asio::async_result<decltype (handler)> result (handler);
#endif

    if (success)
        handler(error_code{}, 42);
    else
        handler(asio::error::operation_aborted, 0);

    return result.get ();
}
...