vamos pegar este pequeno exemplo:
std::expected<std::any, Fault> doN(int n)
{
switch (n)
{
case 1: return do1();
case 2: return do2();
// ...
}
}
std::expected<int, Fault> do1()
{
if (error)
{
return std::unexpected<Fault>({/* ... */});
}
return 23;
}
Se eu fizer dessa forma e chamar auto result = doN(1)
sem erros, então result.value()
o tipo é std::expected<int, Fault>
e não int
(sem mencionar o any_cast
).
A maneira que encontrei para resolver isso é destruir o resultado da chamada interna:
std::expected<std::any, Fault> doN(int n)
{
switch (n)
{
case 1:
auto value = do1();
if (value.has_value()) {
return value.value();
}
return std::unexpected(value.error());
// ...
}
}
O tipo doN(1).value()
é int
.
Então minha pergunta é: Como posso simplificar isso? Existe uma maneira de retornar o resultado da chamada de função?