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?
Para simplificar sua abordagem, você pode usar
std::expected::transform
. Algo como:O método transform faz o seguinte:
std::expected
contém um valor (do1().has_value()
)std::any(value)
) e retorna um novostd::expected
com o valor transformadoIsso significa que pode ser capaz de escrever:
(( Veja o exemplo de demonstração ao vivo ))