Funktionsobjekte

Ein Funktionsobjekt oder Funktionselement, ist jeder Typ, der operator() implementiert. Dieser Operator wird als der Aufrufsoperator oder manchmal der Anwendungsoperator. Die Standard Template Library verwendet Funktionsobjekte hauptsächlich im Sortierungskriterien für Container und in den Algorithmen.

Funktionsobjekte bieten zwei Hauptvorteile über einem geraden Funktionsaufruf. Das erste ist, dass ein Funktionsobjekt Zustand enthalten kann. Das zweite ist, dass ein Funktionsobjekt ein Typ ist und als Vorlagenparameter deshalb verwendet werden kann.

Erstellen eines Funktionsobjekts

Um ein Funktionsobjekt zu erstellen, erstellen Sie einen Typ und implementieren Sie operator(), beispielsweise:

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, ruft jedoch tatsächlich operator() des Funktionselementtyps auf. Diese Ähnlichkeit zwischen dem Aufrufen eines Funktionsobjekts und der Funktion ist, wie das Begriffsfunktionsobjekt geschah.

Mit Funktionsobjekten oder Container

Die Standardvorlagenbibliothek enthält einige Funktionsobjekte in der Headerdatei <functional>. Ein Verwendung dieser Funktionsobjekten ist als Sortierungskriterium für Container. Beispielsweise wird der set deklariert Container, wie folgt:

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

Das zweite ist das Vorlagenargument Funktionsobjekt less. Dies Funktionsobjekt gibt true, wenn der erste Parameter, der an ihn übergebene, kleiner ist, als der übergebene zweite Parameter zurück. Da mehrere Container ihre Elemente sortieren, muss der Container eine Methode des Vergleichs von zwei Elementen, und dieser kann mithilfe des Funktionsobjekts erreicht. Sie können eigene Sortierungskriterien für Container definieren, indem Sie ein Funktionsobjekt erstellen und es in der Vorlagenliste für den Container angeben.

Mit Funktionsobjekten oder Algorithmen

Eine andere Verwendung von funktionalen Objekten ist in den Algorithmen. Beispielsweise wird der Algorithmus remove_if deklariert, wie folgt:

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 true ist, wird auf das Element aus dem Container entfernt, der von der _First und Iteratoren _Last zugegriffen wird. Sie können jede der Funktionsobjekte verwenden, die in der <functional> Header für das Argument _Pred deklariert werden, oder Sie können eigene erstellen.

Siehe auch

Referenz

Standardvorlagenbibliothek