Вывод 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
Ответить

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

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

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

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

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