@ sehe Отлично, спасибо большое. вы сделали мой день ;-)
ел бы создать асинхронную функцию, которая принимает в качестве последнего аргумента boost :: asio :: yield_context. Например.:
int async_meaning_of_life(asio::yield_context yield);
Я также хотел бы согласиться с тем, как Asio возвращает коды ошибок. То есть, если пользователь делает:
int result = async_meaning_of_life(yield);
и функция терпит неудачу, то он бросаетsystem_error
исключение. Но если пользователь делает:
boost::error_code ec;
int result = async_meaning_of_life(yield[ec]);
Тогда - вместо броска - ошибка возвращается вec
.
Проблема в том, что при реализации функции я не могу найти чистый способ проверить, использовался ли оператор [] или нет, и установить его, если так. Мы придумали что-то вроде этого:
inline void set_error(asio::yield_context yield, sys::error_code ec)
{
if (!yield.ec_) throw system_error(ec);
*(yield.ec_) = ec;
}
Но это глупо, потому чтоyield_context::ec_
являетсяобъявлен частным (хотя только в документации).
Еще один способ сделать это - конвертироватьyield
возражать вasio::handler_type
и выполнить его. Но это решение кажется в лучшем случае неудобным.
Есть ли другой способ?