Namespaces
Variants

Function objects

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

Ein Funktionsobjekt ist jedes Objekt, für welches der Funktionsaufruf-Operator definiert ist. C++ bietet viele eingebaute Funktionsobjekte sowie Unterstützung für die Erstellung und Manipulation neuer Funktionsobjekte.

Inhaltsverzeichnis

Funktionsaufruf

Die ausschließlich darstellende Operation INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) wird wie folgt definiert:

Der Typ Obj sei der uneingeschränkte 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 ) (ruft die Memberfunktion auf dem Objekt auf).
  • ( obj. get ( ) . * f ) ( arg_1, arg_2, ..., arg_N ) (ruft die Memberfunktion auf dem speziell referenzierten Objekt auf).
  • Andernfalls
  • ( ( * obj ) . * f ) ( arg_1, arg_2, ..., arg_N ) (ruft die Memberfunktion auf dem dereferenzierten Objekt auf).
  • obj. * mptr (zugreifen auf das Datenelement des Objekts).
  • obj. get ( ) . * mptr (zugreifen auf das Datenelement des speziell referenzierten Objekts).
  • Andernfalls
  • ( * obj ) . * mptr (zugreifen auf das Datenelement des dereferenzierten Objekts).
  • Andernfalls
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) entspricht f ( arg_0, arg_1, arg_2, ..., arg_N ) (ruft das Aufrufbare auf).


Die ausschließlich zu Darstellungszwecken dienende Operation INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) wird 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 der Typ Actual definiert als decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) )

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) ist fehlerhaft.
(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 mit Möglichkeit zur Spezifikation des Rückgabetyps (seit C++23)
(Funktions-Template)

Funktionswrapper

Diese polymorphen Wrapper-Klassen bieten Unterstützung für das Speichern beliebiger Funktionsobjekte.

(C++11)
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt
(Klassen-Template)
Nur-verschiebbarer Wrapper für jedes aufrufbare Objekt, das Qualifier in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template)
kopierbarer Wrapper für jedes kopierkonstruierbare aufrufbare Objekt, das Qualifier in einer gegebenen Aufrufsignatur unterstützt
(Klassen-Template)
nicht-besitzender Wrapper für jedes aufrufbare Objekt
(Klassen-Template)
die Ausnahme, die beim Aufruf eines leeren std::function geworfen wird
(Klasse)
(C++11)
erstellt ein Funktionsobjekt aus einem Zeiger auf ein Mitglied
(Funktions-Template)

Identität

std::identity ist das Identitätsfunktionsobjekt: Es gibt sein Argument unverändert zurück.

(C++20)
Funktionsobjekt, das sein Argument unverändert zurückgibt
(Klasse)

Partielle Funktionsanwendung

std::bind_front und std::bind bieten Unterstützung für partielle Funktionsapplikation , 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 Funktionsobjekt
(Funktions-Template)
(C++11)
bindet ein oder mehrere Argumente an ein Funktionsobjekt
(Funktions-Template)
zeigt an, dass ein Objekt ein std::bind -Ausdruck ist oder als solcher verwendet werden kann
(Klassen-Template)
zeigt an, dass ein Objekt ein Standard-Platzhalter ist oder als solcher verwendet werden kann
(Klassen-Template)
Definiert im Namensraum std::placeholders
Platzhalter für die ungebundenen Argumente in einem std::bind -Ausdruck
(Konstante)

Negatoren

std::not_fn erstellt ein Funktionsobjekt, das das Ergebnis des übergebenen aufrufbaren Objekts negiert.

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

Searcher

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

Implementierung des Standard-C++-Bibliothekssuchalgorithmus
(Klassentemplate)
Implementierung des Boyer-Moore-Suchalgorithmus
(Klassentemplate)
Implementierung des Boyer-Moore-Horspool-Suchalgorithmus
(Klassentemplate)

Referenz-Wrapper

Referenz-Wrapper ermöglichen es, Referenzargumente in kopierbaren Funktionsobjekten zu speichern:

CopyConstructible und CopyAssignable Referenz-Wrapper
(Klassen-Template)
(C++11) (C++11)
erstellt einen std::reference_wrapper mit einem vom Argument abgeleiteten Typ
(Funktions-Template)
ermittelt den in std::reference_wrapper gekapselten Referenztyp
(Klassen-Template)

Transparente Funktionsobjekte

Assoziative Container und Ungeordnete assoziative Container (seit C++20) bieten heterogene Lookup- und Erasure-Operationen (seit C++23) an, diese sind jedoch nur aktiviert, wenn der bereitgestellte Funktionsobjekttyp T transparent ist: Der qualifizierte Bezeichner T::is_transparent ist gültig und bezeichnet einen Typ.

Alle transparenten Funktionsobjekttypen in der Standardbibliothek definieren einen geschachtelten Typ is_transparent . Benutzerdefinierte transparente Funktionsobjekttypen müssen jedoch is_transparent nicht direkt als geschachtelten Typ bereitstellen: Er kann in einer Basisklasse definiert werden, solange T::is_transparent die oben genannte Transparenzanforderung erfüllt.

(seit C++14)

Operator-Funktionsobjekte

C++ definiert die folgenden Funktionsobjekte, die gängige arithmetische und logische Operationen repräsentieren.

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

(since C++14)
Arithmetische Operationen
Funktionsobjekt, das x + y implementiert
(Klassentemplate)
Funktionsobjekt, das x + y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x - y implementiert
(Klassentemplate)
Funktionsobjekt, das x - y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x * y implementiert
(Klassentemplate)
Funktionsobjekt, das x * y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplatespezialisierung)
Funktionsobjekt, das x / y implementiert
(Klassentemplate)
Funktionsobjekt, das x / y implementiert und Parameter- und Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x % y implementiert
(Klassentemplate)
Funktionsobjekt, das x % y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das - x implementiert
(Klassentemplate)
Funktionsobjekt, das - x implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Vergleiche
Funktionsobjekt, das x == y implementiert
(Klassentemplate)
Funktionsobjekt, das x == y implementiert und Parameter- und Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x ! = y implementiert
(Klassentemplate)
Funktionsobjekt, das x ! = y implementiert und Parameter- und Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x > y implementiert
(Klassentemplate)
Funktionsobjekt, das x > y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x < y implementiert
(Klassentemplate)
Funktionsobjekt, das x < y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x >= y implementiert
(Klassentemplate)
Funktionsobjekt, das x >= y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x <= y implementiert
(Klassentemplate)
Funktionsobjekt, das x <= y implementiert und Parameter- und Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Logische Operationen
Funktionsobjekt, das x && y implementiert
(Klassentemplate)
Funktionsobjekt, das x && y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x || y implementiert
(Klassentemplate)
Funktionsobjekt, das x || y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das ! x implementiert
(Klassen-Template)
Funktionsobjekt, das ! x implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Bitweise Operationen
Funktionsobjekt, das x & y implementiert
(Klassentemplate)
Funktionsobjekt, das x & y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x | y implementiert
(Klassentemplate)
Funktionsobjekt, das x | y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
Funktionsobjekt, das x ^ y implementiert
(Klassentemplate)
Funktionsobjekt, das x ^ y implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplate-Spezialisierung)
(C++14)
Funktionsobjekt, das ~x implementiert
(Klassentemplate)
Funktionsobjekt, das ~x implementiert und Parameter- sowie Rückgabetypen ableitet
(Klassentemplatespezialisierung)


Eingeschränkte Vergleichsfunktionsobjekte

Die folgenden Vergleichsfunktionsobjekte sind eingeschrä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 .

eingeschränktes Funktionsobjekt, das x == y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x ! = y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x < y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x > y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x <= y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x >= y implementiert
(Klasse)
eingeschränktes Funktionsobjekt, das x <=> y implementiert
(Klasse)
(seit C++20)


Hilfsmittel

Die folgenden ausschließlich expository Elemente werden für mehrere Komponenten in der Standardbibliothek verwendet, sind jedoch nicht Teil der Schnittstelle der Standardbibliothek.

template < class Fn, class ... Args >

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

} ;
(1) ( Nur zur Darstellung* )
template < class Fn, class ... Args >

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

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


Alte Binder und Adapter

Mehrere Dienstprogramme, die frühe funktionale Unterstützung boten, sind veraltet und entfernt:

Base
(veraltet in C++11) (entfernt in C++17)
Adapter-kompatible unäre Funktionsbasisklasse
(Klassentemplate)
(in C++11 veraltet) (in C++17 entfernt)
Adapter-kompatible binäre Funktionsbasisklasse
(Klassentemplate)
Binder
(in C++11 veraltet) (in C++17 entfernt)
Funktionsobjekt, das eine binäre Funktion und eines ihrer Argumente enthält
(Klassentemplate)
(veraltet in C++11) (entfernt in C++17)
bindet ein Argument an eine binäre Funktion
(Funktions-Template)
Funktionsadapter
(veraltet in C++11) (entfernt in C++17)
Adapter-kompatible Wrapper für einen Zeiger auf eine unäre Funktion
(Klassentemplate)
(veraltet in C++11) (entfernt in C++17)
Adapter-kompatible Wrapper für einen Zeiger auf eine binäre Funktion
(Klassentemplate)
(in C++11 veraltet) (in C++17 entfernt)
erstellt einen adapterkompatiblen Funktionsobjekt-Wrapper aus einem Funktionszeiger
(Funktions-Template)
(in C++11 veraltet) (in C++17 entfernt)
Wrapper für einen Zeiger auf eine nulläre oder unäre Memberfunktion, aufrufbar mit einem Zeiger auf ein Objekt
(Klassentemplate)
(in C++11 veraltet) (in C++17 entfernt)
erstellt einen Wrapper aus einem Zeiger auf eine Member-Funktion, aufrufbar mit einem Zeiger auf ein Objekt
(Funktions-Template)
Wrapper für einen Zeiger auf eine nulläre oder unäre Memberfunktion, aufrufbar mit einer Objektreferenz
(Klassentemplate)
(veraltet in C++11) (entfernt in C++17)
erstellt einen Wrapper aus einem Zeiger auf eine Member-Funktion, aufrufbar mit einer Referenz auf ein Objekt
(Funktions-Template)
(in C++17 veraltet) (in C++20 entfernt)
Wrapper-Funktionsobjekt, das das Komplement des unären Prädikats zurückgibt, das es enthält
(Klassentemplate)
(deprecated in C++17) (removed in C++20)
Wrapper-Funktionsobjekt, das das Komplement des binären Prädikats zurückgibt, das es enthält
(Klassentemplate)
(veraltet in C++17) (entfernt in C++20)
Konstruiert benutzerdefiniertes std::unary_negate Objekt
(Funktions-Template)
(veraltet in C++17) (entfernt in C++20)
Konstruiert benutzerdefiniertes std::binary_negate Objekt
(Funktions-Template)
(bis C++20)

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes 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 nehmen, mussten
geschachtelte 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 ist 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 aufgrund der Lösung von
LWG Issue 2219 nicht korrekt
Behandelt korrekt