std::experimental:: not_fn
Defined in header
<experimental/functional>
|
||
template
<
class
F
>
/*unspecified*/ not_fn ( F && f ) ; |
(library fundamentals TS v2) | |
Creates a forwarding call wrapper that returns the complement of the callable object it holds.
Parameters
f | - | the object from which the Callable object held by the wrapper is constructed |
Return value
Let
FD
be
std::
decay_t
<
F
>
and
fd
be an lvalue of type
FD
constructed from
std::
forward
<
F
>
(
f
)
.
not_fn
returns a forwarding call wrapper
fn
of unspecified type such that
fn
(
a1, a2, ..., aN
)
is equivalent to
!
INVOKE
(
fd, a1, ..., aN
)
, where
INVOKE
is the operation described in
Callable
.
The returned call wrapper is always MoveConstructible , and is CopyConstructible if FD is CopyConstructible .
Remarks
If
fd
is not
Callable
, or
std::
is_constructible
<
FD, F
>
::
value
is not
true
, the behavior is undefined.
Exceptions
Throws no exceptions, unless the construction of
fd
throws.
Possible implementation
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-qualified overload for QoI 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) }; } |
Notes
not_fn
is intended to replace the C++03-era negators
std::not1
and
std::not2
.
See also
(C++17)
|
creates a function object that returns the complement of the result of the function object it holds
(function template) |