Вывод noExceptionC++

Программы на C++. Форум разработчиков
Anonymous
Вывод noException

Сообщение Anonymous »

Иногда у меня есть шаблоны функций, тело которых состоит из одного выражения E, где спецификатор noException функции должен быть noException(E). Насколько мне известно, мне нужно повторить вызов обернутой функции внутри спецификатора noException(noException(E)). Это дублирует выражение E, что делает его редактирование подверженным ошибкам, поскольку если я изменю E в теле функции, я могу забыть изменить его в спецификаторе noException. Я определил макрос для удаления дублирования:

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

#define DEDUCED_NOEXCEPT_FUNCTION(X) noexcept(noexcept(X)) { return (X); }

// Example: f may be noexcept or not depending on parameter types
void f(char *) {/*...*/}
void f(int) noexcept {/*...*/}

// The following expands to:
// void g(auto x)
//   noexcept(noexcept(f(x))) {
//   return (f(x));
// }
void g(auto x) DEDUCED_NOEXCEPT_FUNCTION(f(x))

// The macro works for lambdas too.
// The following expands to:
// auto h = [] (auto x)
//   noexcept(noexcept(f(x))) {
//   return (f(x));
// };
auto h = [] (auto x) DEDUCED_NOEXCEPT_FUNCTION(g(x));
Я также узнал, что для этого можно использовать BOOST_HOF_RETURNS. Но у макросов есть недостатки, и рано или поздно это, вероятно, запутает форматировщик кода и т. д.
Есть ли способ вывести спецификатор noException, не дублируя выражение, которое не использует макросы?
(Я использую C++20, но также интересно, есть ли способы и в других языковых версиях.)

Подробнее здесь: https://stackoverflow.com/questions/797 ... g-noexcept

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