Partager via


Objets de fonction dans la bibliothèque standard C++

Un objet de fonction, ou foncteur, est n’importe quel type implémentant operator(). Cet opérateur est appelé opérateur d’appel ou parfois opérateur d’application. La bibliothèque C++ Standard utilise des objets de fonction essentiellement comme critère de tri pour les conteneurs et dans les algorithmes.

Les objets de fonctions offrent deux avantages par rapport à un appel de fonction direct. Le premier est qu’un objet de fonction peut contenir l’état. Le deuxième est qu’un objet fonction est aussi un type et peut donc être utilisé comme paramètre de modèle.

Création d’un objet de fonction

Pour créer un objet de fonction, créez un type et implémentez operator(), par exemple :

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

La dernière ligne de la fonction main montre comment vous appelez l’objet de fonction. Cet appel ressemble à un appel à une fonction, mais il appelle réellement l’opérateur() du type Functor. Cette similarité entre appeler un objet de fonction et la fonction, est comment le terme objet de fonction agit.

Objets de fonction et conteneurs

La bibliothèque standard C++ contient plusieurs objets de fonction dans le fichier d’en-tête <functional> . Une des utilisations de ces objets de fonction est de servir de critère de tri pour les conteneurs. Par exemple, le conteneur set est déclaré comme suit :

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

Le deuxième argument du modèle est l’objet de fonction less. Cet objet de fonction retourne true si le premier paramètre est inférieur au deuxième paramètre. Étant donné que certains conteneurs trient leurs éléments, le conteneur a besoin d’un moyen de comparer deux éléments. La comparaison est effectuée à l’aide de l’objet de fonction. Vous pouvez définir vos propres critères de tri pour les conteneurs en créant un objet de fonction et en le spécifiant dans la liste des modèles pour le conteneur.

Objets de fonction et algorithmes

Les objets de fonction sont également utilisés dans les algorithmes. Par exemple, l’algorithme remove_if est déclaré comme suit :

template <class ForwardIterator, class Predicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    Predicate pred);

Le dernier argument de remove_if est un objet de fonction qui retourne une valeur booléenne (un prédicat). Si le résultat de l’objet de fonction est true, l’élément est supprimé du conteneur auquel accèdent les itérateurs first et last. Vous pouvez utiliser l’un des objets de fonction déclarés dans l’en-tête <functional> de l’argument pred ou vous pouvez créer vos propres objets.

Voir aussi

Informations de référence sur la bibliothèque standard C++