Condividi tramite


Oggetti funzione

Un oggetto funzione, o il functor, è qualsiasi tipo che implementa l'operatore (). Questo operatore è denominato l'operatore di chiamata o talvolta l'operatore di applicazione. La libreria di modelli standard utilizza oggetti funzione principalmente per criteri di ordinamento per i contenitori e gli algoritmi.

Gli oggetti funzione forniscono due vantaggi principali su una chiamata di funzione diritta. Il primo consiste nel fatto che un oggetto funzione può contenere lo stato. Il secondo è che un oggetto funzione è un tipo e pertanto può essere utilizzato come parametro di modello.

Creare un oggetto funzione

Per creare un oggetto funzione, creare un tipo e implementare operator(), ad esempio:

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);
}

L'ultima riga di funzione di main come chiamate oggetto function. L'aspetto della chiamata a una chiamata a una funzione, ma in realtà viene chiamato operator() di tipo Functor. Questa somiglianze tra chiamare un oggetto funzione e una funzione è come oggetto funzione indicare un succeduto.

Oggetti funzione e contenitori

La libreria di modelli standard contiene diversi oggetti funzione nel file di intestazione <functional>. Un utilizzo di questi oggetti funzione è la chiave di ordinamento per i contenitori. Ad esempio, il contenitore di set è dichiarato come segue:

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

Il secondo argomento di template è l'oggetto function less. Questo oggetto funzione restituisce true se il primo parametro passato è inferiore al secondo parametro passato. Da alcuni contenitori ordinare i relativi elementi, il contenitore consente di confrontare due elementi che fanno questo utilizzo dell'oggetto funzione. È possibile definirne di propri criteri di ordinamento per i contenitori creando un oggetto funzione e specificandolo nell'elenco di modelli del contenitore.

Oggetti funzione e algoritmi

Un altro utilizzo degli oggetti funzionale è negli algoritmi. Ad esempio, l'algoritmo di remove_if è dichiarato come segue:

template<class ForwardIterator, class Predicate>
    ForwardIterator remove_if(
        ForwardIterator _First,
        ForwardIterator _Last,
        Predicate _Pred
    );

L'ultimo argomento a remove_if è un oggetto funzione che restituisce un valore booleano ( un predicato). Se il risultato dell'oggetto funzione è true, l'elemento viene rimosso dal contenitore che viene eseguito dagli iteratori _First e _Last. È possibile utilizzare uno degli oggetti funzione dichiarati nell'intestazione di <functional> per l'argomento _Pred oppure crearne di personalizzati.

Vedere anche

Riferimenti

Libreria di modelli standard