Std::expected и «группы в фигурных скобках внутри выражений»C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Std::expected и «группы в фигурных скобках внутри выражений»

Сообщение Anonymous »

Когда я использовал std::expected, я обнаружил очень многословную обработку передачи ошибки по цепочке вызовов. Чтобы упростить жизнь разработчику, в ржавчине есть знак '?' (распространение ошибок).
Я попытался имитировать это с помощью макроса (я назвал его TRY), который немедленно возвращает значение в случае ошибки или передает значение в противном случае.
Например

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

#include 
#include 

#define TRY(x) __extension__({                       \
auto tmp = x;                                    \
if (!tmp)                                        \
return std::unexpected(tmp.error());         \
tmp.value();                                     \
})

std::expected effe(bool  err) {
if (!err)
return std::unexpected(false);
return 5;
}

std::expected effe2(bool  err) {
auto r = TRY(effe(err));
return r + 3;
}

std::expected effe3(bool  err) {
auto r = effe(err);
if (!r)
return std::unexpected(r.error());
return *r + 3;
}

int main() {

auto r = effe2(false);
if (!r)
printf("Error returned\n");
else
printf("r=%d\n", *r);

r = effe2(true);
if (!r)
printf("Error returned\n");
else
printf("r=%d\n", *r);

r = effe3(false);
if (!r)
printf("Error returned\n");
else
printf("r=%d\n", *r);

return 0;
}
использует макрос, поэтому вам нужно думать только об использовании значения. В effe3() разработчик должен явно управлять ошибкой, возвращая неожиданный результат.
Теперь мой вопрос: помимо того факта, что "фигурные группы внутри выражения» является расширением GCC/CLANG. Видите ли вы какие-либо другие недостатки этого подхода?

Подробнее здесь: https://stackoverflow.com/questions/784 ... xpressions
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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