Como definir error_code como asio :: yield_context
Gostaria de criar uma função assíncrona que leva como último argumento boost :: asio :: yield_context. Por exemplo.:
int async_meaning_of_life(asio::yield_context yield);
Eu também gostaria de ser consistente com a forma como o Asio retorna códigos de erro. Ou seja, se o usuário fizer:
int result = async_meaning_of_life(yield);
e a função falhar, ele lança osystem_error
exceção. Mas se o usuário fizer:
boost::error_code ec;
int result = async_meaning_of_life(yield[ec]);
Então - em vez de jogar - o erro é retornado emec
.
O problema é que, ao implementar a função, parece que não consigo encontrar uma maneira limpa de verificar se o operador [] foi usado ou não e configurá-lo, se for o caso. Chegamos a algo assim:
inline void set_error(asio::yield_context yield, sys::error_code ec)
{
if (!yield.ec_) throw system_error(ec);
*(yield.ec_) = ec;
}
Mas isso é hacky, porqueyield_context::ec_
édeclarado privado (embora apenas na documentação).
Outra maneira de pensar em fazer isso é converter oyield
objeto emasio::handler_type
e execute. Mas essa solução parece estranha, na melhor das hipóteses.
Existe outro caminho?