Freigeben über


Funktionsobjekte in der C++-Standardbibliothek

Ein Funktionsobjekt oder ein Functor ist ein beliebiger operator()Typ, der implementiert wird. 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 zwei Hauptvorteile gegenüber einem regulären Funktionsaufruf. 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 operator(), z. B.:

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

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(a, b);
}

Die letzte Zeile der main -Funktion zeigt, wie Sie das Funktionsobjekt aufrufen. Dieser Aufruf sieht wie ein Aufruf einer Funktion aus, ruft aber tatsächlich den LessThanFunctor Typ aufoperator(). 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 Compare = std::less<Key>,
    class Allocator = std::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 Verwendung von Funktionsobjekten erfolgt in Algorithmen. Beispielsweise wird der remove_if -Algorithmus wie folgt deklariert:

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate 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 lautet true, wird das Element so verschoben, dass es über das neue Ende hinausgeht, von remove_ifdem zurückgegeben wird. Sie können jedes der in der <functional> Kopfzeile deklarierten Funktionsobjekte für das Argument pred verwenden oder eigene erstellen.

Siehe auch

C++-Standardbibliotheksreferenz