Как всплывать значения `std::unexpected`, если ожидаемые типы различаются?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как всплывать значения `std::unexpected`, если ожидаемые типы различаются?

Сообщение Anonymous »

Этот вопрос очень похож на вопрос «Как мы можем переслать неудачный std::expected вверх по стеку вызовов». Учитывая цепочку вызовов функций, каждый из которых возвращает значения std::expected, ошибки должны распространяться вверх по цепочке.
Проблема здесь в том, что, хотя тип ошибки один и тот же на всех уровнях, ожидаемые типы различаются. Насколько я могу судить, это означает, что вы не можете использовать монадические операции для оптимизации кода.
Рассмотрим этот игрушечный парсер рекурсивного спуска:

Код: Выделить всё

#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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»