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
рейтинг
4 комментария
yndx-antoshkka
Отличная идея! Желающие заняться ей - пишите, тут надо будет прежде всего обсудить с автором библиотеки github.com/boostorg/callable_traits , у него уже есть предложенные вами вещи boostorg.github.io/callable_traits/doc/html/index.html
yndx-antoshkka
Antervis
yndx-antoshkka, получается, надо реализовать conversion functions, попробовать просунуть их в буст, а там как пойдет?
Antervis
yndx-antoshkka
Antervis, Библиотека github.com/boostorg/callable_traits уже почти принята в Boost и её хотят перетащить в стандарт С++.

Начать стоит с того, что убедиться что всё необходимое есть в этой библиотеке boostorg.github.io/callable_traits/doc/html/index.html

Если чего-то не хватает - попробовать добавить через pull request
Если уже всё необходимое есть - либо маякнуть чтобы я познакомил вас с разработчиком библиотеки, либо самому связаться с автором библиотеки и предложить ему свою помощь с продвижением в стандарт.
yndx-antoshkka
Antervis
yndx-antoshkka, в этой библиотеке есть преобразования типов, но отсутствуют функции преобразования самих callable объектов
Antervis
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).