std::experimental::not_fn
| Definiert im Header <experimental/functional> |
||
| template< class F> /*nicht spezifiziert*/ not_fn( F&& f ); |
(Library Fundamentals TS v2) | |
Erzeugt einen Forwarding-Aufruf-Wrapper, der die Negation des von ihm gehaltenen aufrufbaren Objekts zurückgibt.
Inhalt |
[bearbeiten] Parameter
| f | - | das Objekt, aus dem das Callable-Objekt, das vom Wrapper gehalten wird, konstruiert wird |
[bearbeiten] Rückgabewert
Sei FD std::decay_t<F> und fd ein lvalue vom Typ FD, konstruiert aus std::forward<F>(f).
not_fn gibt einen Forwarding-Aufruf-Wrapper fn unbekannten Typs zurück, so dass fn(a1, a2, ..., aN) äquivalent zu !INVOKE(fd, a1, ..., aN) ist, wobei INVOKE die in Callable beschriebene Operation ist.
Der zurückgegebene Aufruf-Wrapper ist immer MoveConstructible und ist CopyConstructible, wenn FD CopyConstructible ist.
[bearbeiten] Hinweise
Wenn fd nicht Callable ist oder std::is_constructible<FD, F>::value nicht true ist, ist das Verhalten undefiniert.
[bearbeiten] Ausnahmen
Wirft keine Ausnahmen, es sei denn, die Konstruktion von fd wirft eine Ausnahme.
[bearbeiten] Mögliche Implementierung
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) }; } |
[bearbeiten] Anmerkungen
not_fn soll die Negatoren aus der C++03-Ära std::not1 und std::not2 ersetzen.
[bearbeiten] Siehe auch
| (C++17) |
erstellt ein Funktions-Objekt, das das Komplement des Ergebnisses des gehaltenen Funktions-Objekts zurückgibt (Funktions-Template) |