Callable noexcept'ness conversion

Antervis
Antervis

В с++17 noexcept - часть типа Callable объекта. Соответственно, возможны ошибки компиляции или более медленные fallback'и (например, в STL) если в функцию, требующую Res(Args...)noexcept пытаться передать Res(Args...). Предлагаю добавить:

type_traits:

  • add_noexcept, add_noexcept_t - возвращает тип с измененной сигнатурой вызова*
  • remove_noexcept, remove_noexcept_t - по аналогии

conversion functions:

  • assume_noexcept(Callable f) -> NoexceptCallable - создает обертку над f, с noexcept-версиями operator(). Если f кидает исключение, будет вызван std::terminate.
  • ignore_noexcept(NoexceptCallable f) -> Callable - снимает noexcept'ness с вызова.
  • handle_noexcept(Callable f, ExceptionHandler ...handlers) -> NoexceptCallable - создает обертку над f, с noexcept-версиями operator(). Если f кидает исключение, оно будет поймано и обработано через ExceptionHandler подходящего типа (сигнатура ExceptionHandler - void(Type&&) для catch (Type&&), или void() для catch (...)). Если f кидает исключение другого типа, вызывается std::terminate

constexpr /*implementation-defined*/ all_overloads = /*implementation-defined*/; - флаг для указания в качестве шаблонных параметров вышеназванных функций, см. ниже* Для объектов без перегруженного operator(), дополнительные шаблонные параметры указывать не нужно. Иначе, необходимо:

либо указать ...Args, с которыми вызывается operator(Args...), и результатом будет объект/тип объекта, одна из перегрузок operator() которого поменяет noexcept'ness

либо передать в шаблон all_overloads - вернет объект/тип объекта, все перегрузки operator() которого поменяют noexcept'ness

 

Вроде как всё это реализуемо в рамках c++17. Разве что all_overloads версии через шаблонную рекурсию

5
рейтинг
Нет комментариев
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).