Funktionsobjekte in der C++-Standardbibliothek

Ein Funktionsobjektoder Funktionselementist ein beliebiger Typ, der „operator()“ implementiert. Dieser Operator wird als Aufrufoperator oder manchmal als Anwendungsoperatorbezeichnet. Die C++-Standardbibliothek verwendet Funktionsobjekte hauptsächlich als Sortierungskriterien für Container und in Algorithmen.

„Funktionsobjekte“ bieten gegenüber einem konventionellen Funktionsaufruf zwei wesentliche Vorteile. Der erste Vorteil ist, dass ein Funktionsobjekt einen Zustand enthalten kann. Der zweite Vorteil ist, dass ein Funktionsobjekt ein Typ ist und daher nicht als Vorlagenparameter verwendet werden kann.

Erstellen eines Funktionsobjekts

Um ein Funktionsobjekt zu erstellen, erstellen Sie einen Typ, und implementieren Sie „operator()“, z. B.:

class Functor
{
public:
    int operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    Functor f;
    int a = 5;
    int b = 7;
    int ans = f(a, b);
}

Die letzte Zeile der main -Funktion zeigt, wie Sie das Funktionsobjekt aufrufen. Dieser Aufruf sieht wie ein Aufruf einer Funktion aus, aber es wird tatsächlich operator() des Functor-Typs aufgerufen. Diese Ähnlichkeit zwischen dem Aufruf eines Funktionsobjekts und einer Funktion hat zum Begriff „Funktionsobjekt“ geführt.

Funktionsobjekte und Container

Die C++-Standardbibliothek enthält mehrere Funktionsobjekte in der <functional> Headerdatei. Eine Verwendung dieser Funktionsobjekte ist als Sortierungskriterium für Container. Beispielsweise wird der set -Container wie folgt deklariert:

template <class Key,
    class Traits=less<Key>,
    class Allocator=allocator<Key>>
class set

Das zweite Vorlagenargument ist das Funktionsobjekt „ less“. Dieses Funktionsobjekt gibt zurück true , wenn der erste Parameter kleiner als der zweite Parameter ist. Da einige Container ihre Elemente sortieren, benötigt der Container eine Möglichkeit, zwei Elemente zu vergleichen. Der Vergleich erfolgt mithilfe des Funktionsobjekts. Sie können eigene Sortierungskriterien für Container definieren, indem Sie ein Funktionsobjekt erstellen und es in der Vorlagenliste für den Container angeben.

Funktionsobjekte und Algorithmen

Eine weitere Verwendungsmöglichkeit von Funktionsobjekten ist in Algorithmen. Beispielsweise wird der remove_if -Algorithmus wie folgt deklariert:

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    Predicate pred);

Das letzte Argument für remove_if ist ein Funktionsobjekt, das einen booleschen Wert zurückgibt (ein Prädikat). Wenn das Ergebnis des Funktionsobjekts trueist, wird das Element aus dem Container entfernt, auf den die Iteratoren first und lastzugreifen. Sie können jedes der in der <functional> Kopfzeile deklarierten Funktionsobjekte für das Argument pred verwenden oder eigene erstellen.

Siehe auch

C++-Standardbibliotheksreferenz