Objets de fonction
Objet de fonction, ou le functor, n'importe quel type qui implémente operator(). Cet opérateur est appelée l'opérateur d'appel ou parfois de l'opérateur d'application. Les utilisations Standard TEMPLATE bibliothèque d'objets fonctionnent essentiellement comme critère de tri des conteneurs et des algorithmes.
Les objets de fonctions fournissent deux avantages par rapport à un appel de fonction droite. Le premier est un objet de la fonction peut contenir l'état. Le deuxième est qu'un objet de la fonction est de type et peut donc être utilisé comme paramètre de modèle.
Créer un objet function
Pour créer un objet de la fonction, créez un type et implémenter 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 d'main montre comment vous appelez l'objet de la fonction. Les exemple de l'appel à un appel à une fonction, mais elle appelle réellement operator() du type de Functor. Cette similarité entre l'objet de la fonction et la fonction est comment l'objet function de terme est survenu.
Objets de fonction et conteneurs
La norme TEMPLATE Library contient plusieurs objets de fonction dans le fichier d'en-tête de <functional>. Une utilisation de ces objets de fonction est utilisée comme critère de tri pour les conteneurs. Par exemple, le conteneur de set est déclaré comme suit :
template <
class Key,
class Traits=less<Key>,
class Allocator=allocator<Key> >
class set
Le deuxième argument TEMPLATE est l'objet lessde fonction. Cet objet de fonction retourne true si le premier paramètre transmis à est inférieur au second paramètre transmis. Dans la mesure où certains conteneurs trier les éléments, le conteneur a besoin d'une méthode pour comparer deux éléments, et cela s'effectue à l'aide de l'objet de la fonction. Vous pouvez définir vos propres critères de tri des conteneurs en créant un objet de la fonction et en les spécifiant dans la liste de modèles pour le conteneur.
Objets de fonction et les algorithmes
Une autre utilisation des objets fonctionnels dans les algorithmes. Par exemple, l'algorithme d'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 la fonction qui retourne une valeur booléenne ( attribut). Si le résultat de fonction est true, l'élément est supprimé du conteneur accessible via les itérateurs _First et _Last. Vous pouvez utiliser des objets à l'aide de la fonction déclarés dans l'en-tête de <functional> pour l'argument _Pred ou vous pouvez créer vos propres.