Partager via


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

Un objet de fonction, ou un fonctor, est n’importe quel type qui implémente 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 fonction offrent deux principaux avantages par rapport à un appel de fonction standard. 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 LessThanFunctor
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
};

int main()
{
    LessThanFunctor less_than;
    int a = 5;
    int b = 7;
    bool ans = less_than(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 operator() réellement le LessThanFunctor type. 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 Compare = std::less<Key>,
    class Allocator = std::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

Une autre utilisation des objets de fonction se trouve dans les algorithmes. Par exemple, l’algorithme remove_if est déclaré comme suit :

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if(
    ForwardIterator first,
    ForwardIterator last,
    UnaryPredicate 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 décalé de telle sorte qu’il dépasse la nouvelle fin retournée par remove_if. 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++