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

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