Oggetti funzione della libreria standard C++
Un oggetto funzione, o funtore, è qualsiasi tipo che implementa operator(). Questo operatore è definito operatore di chiamata o talvolta operatore di applicazione. La libreria standard C++ usa oggetti funzione principalmente come criteri di ordinamento per i contenitori e negli algoritmi.
Gli oggetti funzione offrono due vantaggi principali rispetto a una chiamata di funzione diretta. Il primo consiste nel fatto che un oggetto funzione può contenere lo stato. Il secondo è che un oggetto funzione è un tipo e quindi può essere usato come parametro di modello.
Creazione di un oggetto Function
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 della funzione main
mostra come chiamare l'oggetto function. Questa chiamata è simile a una chiamata a una funzione, ma chiama effettivamente operator() del tipo Functor. Questa somiglianza tra la chiamata a un oggetto funzione e una funzione rappresenta il modo in cui è stato coniato il termine oggetto funzione.
Oggetti funzione e contenitori
La libreria standard C++ contiene diversi oggetti funzione nel <functional>
file di intestazione. Uno degli usi di questi oggetti funzione è come criterio di ordinamento per i contenitori. Ad esempio, il contenitore set
è dichiarato come segue:
template <class Key,
class Traits=less<Key>,
class Allocator=allocator<Key>>
class set
Il secondo argomento di modello è l'oggetto funzione less
. Questo oggetto funzione restituisce true
se il primo parametro è minore del secondo parametro. Poiché alcuni contenitori ordinano i relativi elementi, il contenitore necessita di un modo per confrontare due elementi. Il confronto viene eseguito usando l'oggetto funzione . È possibile definirne i 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 uso degli oggetti funzione è negli algoritmi. Ad esempio, l'algoritmo 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 a cui accedono gli iteratori first
e last
. È possibile usare uno qualsiasi degli oggetti funzione dichiarati nell'intestazione per l'argomento <functional>
pred
oppure è possibile crearne uno personalizzato.