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.