Condividi tramite


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.

Vedi anche

Informazioni di riferimento per la libreria standard C++