Проблема здесь в том, что, хотя тип ошибки один и тот же на всех уровнях, ожидаемые типы различаются. Насколько я могу судить, это означает, что вы не можете использовать монадические операции для оптимизации кода.
Рассмотрим этот игрушечный парсер рекурсивного спуска:
Код: Выделить всё
#include
#include
#include
#include
#include
struct Error { std::string msg; };
struct Bar { int x; };
struct Foo { Bar pair[2]; };
std::expected ParseBar() {
return std::unexpected("syntax error in Bar");
}
std::expected ParseFoo() {
auto bar0 = ParseBar();
if (!bar0.has_value()) return std::unexpected{std::move(bar0.error())};
auto bar1 = ParseBar();
if (!bar1.has_value()) return std::unexpected{std::move(bar1.error())};
Foo foo;
foo.pair[0] = std::move(bar0.value());
foo.pair[1] = std::move(bar1.value());
return foo;
}
int main() {
auto foo = ParseFoo();
if (!foo.has_value()) {
std::cerr
Подробнее здесь: [url]https://stackoverflow.com/questions/79838148/how-to-bubble-up-stdunexpected-values-when-the-expected-types-are-different[/url]
Мобильная версия