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.