Namensräume
Varianten
Aktionen

Funktionsobjekte

Von cppreference.com
< cpp‎ | utility
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Funktionsobjekte
Bit-Manipulation (C++20)
(C++11)
Relationale Operatoren (in C++20 veraltet)
 
Funktionsobjekte
Funktionsaufruf
(C++17)(C++23)
Identitätsfunktions-Objekt
(C++20)
Transparente Operator-Wrapper
(C++14)
(C++14)
(C++14)
(C++14)  
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)
(C++14)

Alte Binder und Adaptoren
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
(bis C++17*)(bis C++17*)
(bis C++17*)(bis C++17*)

(bis C++17*)
(bis C++17*)(bis C++17*)(bis C++17*)(bis C++17*)
(bis C++20*)
(bis C++20*)
 

Ein Funktions-Objekt ist jedes Objekt, für das der Funktionsaufruf-Operator definiert ist. C++ stellt viele eingebaute Funktions-Objekte sowie Unterstützung für die Erstellung und Manipulation neuer Funktions-Objekte bereit.

Inhalt

[bearbeiten] Funktionsaufruf

Die expositions-nur Operation INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) ist wie folgt definiert

Sei Typ Obj der unveränderte Typ von arg_0 (d.h. std::remove_cv<std::remove_reference<decltype(arg_0)>::type>::type)

  • (obj.*f)(arg_1, arg_2, ..., arg_N) (Aufruf der Memberfunktion auf dem Objekt).
  • (obj.get().*f)(arg_1, arg_2, ..., arg_N) (Aufruf der Memberfunktion auf dem speziell referenzierten Objekt).
  • Andernfalls
  • ((*obj).*f)(arg_1, arg_2, ..., arg_N) (Aufruf der Memberfunktion auf dem dereferenzierten Objekt).
  • obj.*mptr (Zugriff auf das Datenmember des Objekts).
  • obj.get().*mptr (Zugriff auf das Datenmember des speziell referenzierten Objekts).
  • Andernfalls
  • (*obj).*mptr (Zugriff auf das Datenmember des dereferenzierten Objekts).
  • Andernfalls
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) ist äquivalent zu f(arg_0, arg_1, arg_2, ..., arg_N) (Aufruf des aufrufbaren Objekts).


Die expositions-nur Operation INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) ist wie folgt definiert

  • Wenn R (möglicherweise cv-qualifiziert) void ist
  • static_cast<void>(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N)).
  • Andernfalls
  • INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N) implizit konvertiert zu R.

Sei Typ Actual decltype(INVOKE(f, arg_0, arg_1, arg_2, ..., arg_N))

  • INVOKE<R>(f, arg_0, arg_1, arg_2, ..., arg_N) ist ill-formed.
(seit C++23)
(seit C++11)


std::invoke und std::invoke_r(seit C++23) können jedes Callable-Objekt mit gegebenen Argumenten gemäß den Regeln von INVOKE und INVOKE<R>(seit C++23) aufrufen.

(C++17)(C++23)
ruft jedes Callable-Objekt mit gegebenen Argumenten auf und der Möglichkeit, den Rückgabetyp anzugeben(seit C++23)
(Funktions-Template) [bearbeiten]

[bearbeiten] Funktions-Wrapper

Diese polymorphen Wrapper-Klassen bieten Unterstützung für die Speicherung beliebiger Funktions-Objekte.

(C++11)
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt
(Klassen-Template) [bearbeiten]
Move-only-Wrapper für jedes aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template) [bearbeiten]
kopierfähiger Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifizierer in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template) [bearbeiten]
nicht-besitzender Wrapper für jedes aufrufbare Objekt
(Klassen-Template) [bearbeiten]
die Ausnahme, die beim Aufruf einer leeren std::function ausgelöst wird
(Klasse) [bearbeiten]
(C++11)
erstellt ein Funktions-Objekt aus einem Zeiger auf ein Member
(Funktions-Template) [bearbeiten]

[bearbeiten] Identität

std::identity ist das Identitätsfunktions-Objekt: es gibt sein Argument unverändert zurück.

(C++20)
Funktions-Objekt, das sein Argument unverändert zurückgibt
(Klasse) [bearbeiten]

[bearbeiten] Partielle Funktionsanwendung

std::bind_front und std::bind bieten Unterstützung für die partielle Funktionsanwendung, d.h. das Binden von Argumenten an Funktionen zur Erzeugung neuer Funktionen.

(C++20)(C++23)
bindet eine variable Anzahl von Argumenten, in Reihenfolge, an ein Funktions-Objekt
(Funktions-Template) [bearbeiten]
(C++11)
bindet ein oder mehrere Argumente an ein Funktions-Objekt
(Funktions-Template) [bearbeiten]
zeigt an, dass ein Objekt ein std::bind-Ausdruck ist oder als solcher verwendet werden kann
(Klassen-Template) [bearbeiten]
zeigt an, dass ein Objekt ein Standard-Platzhalter ist oder als solcher verwendet werden kann
(Klassen-Template) [bearbeiten]
Definiert im Namespace std::placeholders
Platzhalter für die ungebundenen Argumente in einem std::bind-Ausdruck
(Konstante) [bearbeiten]

[bearbeiten] Negatoren

std::not_fn erstellt ein Funktions-Objekt, das das Ergebnis des übergebenen aufrufbaren Objekts negiert.

(C++17)
erstellt ein Funktions-Objekt, das das Komplement des Ergebnisses des gehaltenen Funktions-Objekts zurückgibt
(Funktions-Template) [bearbeiten]

[bearbeiten] Sucher

Sucher, die mehrere Zeichenketten-Suchalgorithmen implementieren, werden bereitgestellt und können entweder direkt oder mit std::search verwendet werden.

Implementierung des standardmäßigen C++-Bibliotheks-Suchalgorithmus
(Klassen-Template) [bearbeiten]
Implementierung des Boyer-Moore-Suchalgorithmus
(Klassen-Template) [bearbeiten]
Implementierung des Boyer-Moore-Horspool-Suchalgorithmus
(Klassen-Template) [bearbeiten]

[bearbeiten] Referenz-Wrapper

Referenz-Wrapper ermöglichen die Speicherung von Referenzargumenten in kopierfähigen Funktions-Objekten

CopyConstructible und CopyAssignable Referenz-Wrapper
(Klassen-Template) [bearbeiten]
(C++11)(C++11)
erstellt einen std::reference_wrapper, wobei der Typ aus seinem Argument abgeleitet wird
(Funktions-Template) [bearbeiten]
holt den Referenztyp, der in std::reference_wrapper eingepackt ist
(Klassen-Template) [bearbeiten]

Transparente Funktions-Objekte

Assoziative Container und ungeordnete assoziative Container(seit C++20) bieten heterogene Lookups und Löschoperationen(seit C++23), aber diese sind nur dann aktiviert, wenn der angegebene Funktions-Objekt-Typ T transparent ist: Der qualifizierte Bezeichner T::is_transparent ist gültig und bezeichnet einen Typ.

Alle transparenten Funktions-Objekt-Typen in der Standardbibliothek definieren einen verschachtelten Typ is_transparent. Benutzerdefinierte transparente Funktions-Objekt-Typen müssen is_transparent jedoch nicht direkt als verschachtelten Typ bereitstellen: er kann in einer Basisklasse definiert sein, solange T::is_transparent die oben genannte transparente Anforderung erfüllt.

(seit C++14)

[bearbeiten] Operator-Funktions-Objekte

C++ definiert die folgenden Funktions-Objekte, die gängige arithmetische und logische Operationen darstellen.

Die void-Spezialisierungen leiten ihre Parameter- und Rückgabetypen von ihren Argumenten ab, sie sind alle transparent.

(seit C++14)
Arithmetische Operationen
Funktions-Objekt, das x + y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x + y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x - y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x - y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x * y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x * y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x / y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x / y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x % y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x % y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das -x implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das -x implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Vergleiche
Funktions-Objekt, das x == y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x == y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x != y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x != y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x > y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x > y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x < y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x < y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x >= y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x >= y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x <= y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x <= y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Logische Operationen
Funktions-Objekt, das x && y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x && y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das x || y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x || y implementiert und Parameter- und Rückgabetypen ableitet
(Klassen-Template-Spezialisierung) [bearbeiten]
Funktions-Objekt, das !x implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das !x implementiert und Parameter- und Rückgabetypen ableitet
(Klassenvorlagenspezialisierung) [edit]
Bitweise Operationen
Funktionsobjekt, das x & y implementiert
(Klassenvorlage) [edit]
Funktionsobjekt, das x & y implementiert, wobei Parameter- und Rückgabetypen abgeleitet werden
(Klassenvorlagenspezialisierung) [edit]
Funktionsobjekt, das x | y implementiert
(Klassenvorlage) [edit]
Funktionsobjekt, das x | y implementiert, wobei Parameter- und Rückgabetypen abgeleitet werden
(Klassenvorlagenspezialisierung) [edit]
Funktionsobjekt, das x ^ y implementiert
(Klassenvorlage) [edit]
Funktionsobjekt, das x ^ y implementiert, wobei Parameter- und Rückgabetypen abgeleitet werden
(Klassenvorlagenspezialisierung) [edit]
(C++14)
Funktionsobjekt, das ~x implementiert
(Klassenvorlage) [edit]
Funktionsobjekt, das ~x implementiert, wobei Parameter- und Rückgabetypen abgeleitet werden
(Klassenvorlagenspezialisierung) [edit]


Beschränkte Vergleichsfunktionsobjekte

Die folgenden Vergleichsfunktionsobjekte sind beschränkt.

  • Die Gleichheitsoperatoren (ranges::equal_to und ranges::not_equal_to) erfordern, dass die Typen der Argumente equality_comparable_with erfüllen.
  • Die relationalen Operatoren (ranges::less, ranges::greater, ranges::less_equal und ranges::greater_equal) erfordern, dass die Typen der Argumente totally_ordered_with erfüllen.
  • Der Drei-Wege-Vergleichsoperator (compare_three_way) erfordert, dass der Typ three_way_comparable_with modelliert.

Alle diese Funktionsobjekte sind transparent.

Beschränktes Funktionsobjekt, das x == y implementiert
(Klasse) [edit]
Beschränktes Funktionsobjekt, das x != y implementiert
(Klasse) [edit]
Beschränktes Funktionsobjekt, das x < y implementiert
(Klasse) [edit]
Beschränktes Funktionsobjekt, das x > y implementiert
(Klasse) [edit]
Beschränktes Funktionsobjekt, das x <= y implementiert
(Klasse) [edit]
Beschränktes Funktionsobjekt, das x >= y implementiert
(Klasse) [edit]
beschränkte Funktionsobjekte, die x <=> y implementieren
(Klasse) [edit]
(seit C++20)


Hilfselemente

Die folgenden nur für die Exposition bestimmten Elemente werden für verschiedene Komponenten in der Standardbibliothek verwendet, sind aber nicht Teil der Schnittstelle der Standardbibliothek.

template< class Fn, class... Args >

concept /*callable*/ =
    requires (Fn&& fn, Args&&... args) {
        std::forward<Fn>(fn)(std::forward<Args>(args)...);

    };
(1) (nur Exposition*)
template< class Fn, class... Args >

concept /*nothrow-callable*/ =
    /*callable*/<Fn, Args...> &&
    requires (Fn&& fn, Args&&... args) {
        { std::forward<Fn>(fn)(std::forward<Args>(args)...) } noexcept;

    };
(2) (nur Exposition*)
template< class Fn, class... Args >
using /*call-result-t*/ = decltype(std::declval<Fn>()(std::declval<Args>()...));
(3) (nur Exposition*)
template< const auto& T >
using /*decayed-typeof*/ = decltype(auto(T));
(4) (nur Exposition*)
(seit C++26)


Alte Binder und Adaptoren

Einige Dienstprogramme, die eine frühe funktionale Unterstützung boten, sind veraltet und entfernt worden

Basis
(in C++11 veraltet)(in C++17 entfernt)
Adaptor-kompatible Basisklasse für unäre Funktionen
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
Adaptor-kompatible Basisklasse für binäre Funktionen
(Klassenvorlage) [edit]
Binder
(in C++11 veraltet)(in C++17 entfernt)
Funktionsobjekt, das eine binäre Funktion und eines ihrer Argumente speichert
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
bindet ein Argument an eine binäre Funktion
(Funktionsvorlage) [edit]
Funktionsadaptoren
(in C++11 veraltet)(in C++17 entfernt)
Adaptor-kompatibler Wrapper für einen Zeiger auf eine unäre Funktion
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
Adaptor-kompatibler Wrapper für einen Zeiger auf eine binäre Funktion
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
erstellt einen adaptor-kompatiblen Funktionsobjekt-Wrapper aus einem Funktionszeiger
(Funktionsvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
Wrapper für einen Zeiger auf eine nulläre oder unäre Member-Funktion, aufrufbar mit einem Objektzeiger
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
erstellt einen Wrapper aus einem Zeiger auf eine Member-Funktion, aufrufbar mit einem Objektzeiger
(Funktionsvorlage) [edit]
Wrapper für einen Zeiger auf eine nulläre oder unäre Member-Funktion, aufrufbar mit einer Objekt-Referenz
(Klassenvorlage) [edit]
(in C++11 veraltet)(in C++17 entfernt)
erstellt einen Wrapper aus einem Zeiger auf eine Member-Funktion, aufrufbar mit einer Objekt-Referenz
(Funktionsvorlage) [edit]
(in C++17 veraltet)(in C++20 entfernt)
Wrapper-Funktionsobjekt, das die Negation (Komplement) des von ihm gehaltenen unären Prädikats zurückgibt
(Klassenvorlage) [edit]
(in C++17 veraltet)(in C++20 entfernt)
Wrapper-Funktionsobjekt, das die Negation (Komplement) des von ihm gehaltenen binären Prädikats zurückgibt
(Klassenvorlage) [edit]
(in C++17 veraltet)(in C++20 entfernt)
konstruiert ein benutzerdefiniertes std::unary_negate-Objekt
(Funktionsvorlage) [edit]
(in C++17 veraltet)(in C++20 entfernt)
konstruiert ein benutzerdefiniertes std::binary_negate-Objekt
(Funktionsvorlage) [edit]
(bis C++20)

[edit] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 185 C++98 die Verwendung von Funktionsobjekten verbesserte die Programmeffizienz die Behauptung wurde entfernt
LWG 660 C++98 Funktionsobjekte für bitweise Operationen fehlen hinzugefügt
LWG 2149 C++98 Funktionsobjekte, die ein oder zwei Argumente aufnahmen, mussten
verschachtelte Typen zur Bezeichnung der Argument- und Ergebnistypen bereitstellen
nicht erforderlich.
LWG 2219 C++11 INVOKE behandelte std::reference_wrapper nicht korrekt behandelt korrekt
LWG 2420 C++11 INVOKE<R> verwarf den Rückgabewert nicht, wenn R void war verwirft den Rückgabewert in diesem Fall
LWG 2926
(P0604R0)
C++11 die Syntax der INVOKE-Operation mit einem Rückgabe-
typ R war INVOKE(f, t1, t2, ..., tN, R)
geändert zu
INVOKE<R>(f, t1, t2, ..., tN)
LWG 3655 C++11 INVOKE behandelte Unions nicht korrekt
wegen der Auflösung von LWG-Problem 2219
behandelt korrekt