Namensräume
Varianten
Aktionen

std::experimental::not_fn

Von cppreference.com
 
 
 
 
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) [bearbeiten]