Namespaces
Variants

std::experimental:: not_fn

From cppreference.net
Definiert in Header <experimental/functional>
template < class F >
/*unspecified*/ not_fn ( F && f ) ;
(Library Fundamentals TS v2)

Erstellt einen Weiterleitungsaufruf-Wrapper, der das Komplement des aufrufbaren Objekts zurückgibt, das er enthält.

Inhaltsverzeichnis

Parameter

f - das Objekt, von dem das Callable Objekt, das vom Wrapper gehalten wird, konstruiert wird

Rückgabewert

Sei FD gleich std:: decay_t < F > und fd ein Lvalue vom Typ FD , konstruiert aus std:: forward < F > ( f ) .

not_fn gibt einen weiterleitenden Aufruf-Wrapper fn eines nicht näher spezifizierten Typs zurück, sodass fn ( a1, a2, ..., aN ) äquivalent zu ! INVOKE ( fd, a1, ..., aN ) ist, wobei INVOKE die in Callable beschriebene Operation bezeichnet.

Der zurückgegebene Aufruf-Wrapper ist immer MoveConstructible und ist CopyConstructible , wenn FD CopyConstructible ist.

Anmerkungen

Wenn fd nicht Callable ist, oder std:: is_constructible < FD, F > :: value nicht true ist, ist das Verhalten undefiniert.

Ausnahmen

Wirft keine Ausnahmen, es sei denn, die Konstruktion von fd wirft.

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-qualifizierte Überladung für 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) }; }

Hinweise

not_fn soll die Negatoren aus der C++03-Ära std::not1 und std::not2 ersetzen.

Siehe auch

(C++17)
erstellt ein Funktionsobjekt, das das Komplement des Ergebnisses des von ihm gehaltenen Funktionsobjekts zurückgibt
(Funktions-Template)