std::experimental:: not_fn
|
Определено в заголовочном файле
<experimental/functional>
|
||
|
template
<
class
F
>
/*unspecified*/ not_fn ( F && f ) ; |
(TS фундаментальной библиотеки v2) | |
Создает оболочку вызова с переадресацией, которая возвращает дополнение вызываемого объекта, который она хранит.
Содержание |
Параметры
| f | - | объект, из которого создаётся Callable объект, хранящийся в обёртке |
Возвращаемое значение
Пусть
FD
будет
std::
decay_t
<
F
>
и
fd
будет lvalue типа
FD
, созданное из
std::
forward
<
F
>
(
f
)
.
not_fn
возвращает передающую обёртку вызова
fn
неопределённого типа, такую что
fn
(
a1, a2, ..., aN
)
эквивалентно
!
INVOKE
(
fd, a1, ..., aN
)
, где
INVOKE
— операция, описанная в
Callable
.
Возвращаемая обёртка вызова всегда является MoveConstructible и является CopyConstructible , если FD является CopyConstructible .
Примечания
Если
fd
не является
Callable
, или
std::
is_constructible
<
FD, F
>
::
value
не равно
true
, поведение не определено.
Исключения
Не генерирует исключений, если только конструкция
fd
не генерирует исключение.
Возможная реализация
namespace detail { template<class F> struct not_fn_t { F f; template<class... Args> auto operator()(Args&&... args) noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } // перегрузка с cv-квалификаторами для улучшения качества реализации template<class... Args> auto operator()(Args&&... args) const noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } template<class... Args> auto operator()(Args&&... args) volatile noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } template<class... Args> auto operator()(Args&&... args) const volatile noexcept(noexcept(!std::invoke(f, std::forward<Args>(args)...))) -> decltype(!std::invoke(f, std::forward<Args>(args)...)) { return !std::invoke(f, std::forward<Args>(args)...); } }; } template<class F> detail::not_fn_t<std::decay_t<F>> not_fn(F&& f) { return { std::forward<F>(f) }; } |
Примечания
not_fn
предназначен для замены негаторов эпохи C++03
std::not1
и
std::not2
.
Смотрите также
|
(C++17)
|
создает функциональный объект, который возвращает дополнение результата функционального объекта, который он содержит
(шаблон функции) |