Objets-fonctions
Un objet-fonction ou foncteur est un objet pour lequel l'opérateur d'appel de fonction (operator()) est défini. Les foncteurs apportent des fonctionnalités issues de la programmation fonctionnelle. Ils sont utiles pour manipuler des fonctions de la même façon que des objets classiques et sont utilisés dans la bibliothèque d'algorithmes. Le C++ fournit des foncteurs prédéfinis ainsi que des mécanismes pour créer et manipuler de nouveaux foncteurs.
Remarque : on appelle foncteur toute cible appelable, par exemple une lambda (fonction anonyme) ou un bind (application partielle de fonction), mais plus rigoureusement, en POO, un foncteur est une instance d'une classe définissant operator(), d'où le terme objet-fonction.
Sommaire |
[modifier] Création de foncteurs
La STL fournit plusieurs templates pour créer des foncteurs. De par leur généricité, ces templates permettent de gérer n'importe quelle signature de fonction.
(C++11) |
adaptateur générique de foncteur (classe générique) |
(C++11) |
crée un foncteur permettant d'accéder à un membre de classe donné; le foncteur prend alors en paramètre une instance de la classe (fonction générique) |
(C++11) |
exception levée si operator() est appelé sur un objet qui n'est pas un foncteur (classe) |
[modifier] Liaison de paramètres et application partielle
std::bind permet de faire de la liaison de paramètres et de l'application partielle de fonction. En d'autres termes, il s'agit de créer un nouveau foncteur à partir d'un foncteur existant, en changeant l'ordre de ses paramètres ou en fixant la valeur d'une partie de ses paramètres.
(C++11) |
liaison de paramètres et application partielle d'un foncteur (fonction générique) |
(C++11) |
indique si un objet vient d'un std::bind (classe générique) |
(C++11) |
indique si un objet est un placeholder standard (numéro de paramètre) (classe générique) |
Defined in namespace
std::placeholders | |
(C++11) |
placeholders (numéros de paramètre) pour les std::bind (constante) |
[modifier] Adaptateurs de références
std::reference_wrapper permet de manipuler une référence comme un objet (que l'on peut copier ou auquel on peut affecter une valeur).
(C++11) |
adaptateur de référence respectant CopyConstructible et CopyAssignable (classe générique) |
(C++11) (C++11) |
crée un std::reference_wrapper dont le type est déduit du paramètre (fonction générique) |
[modifier] Foncteurs prédéfinis
La STL fournit des foncteurs implémentant quelques opérations arithmétiques ou logiques classiques.
Opérations arithmétiques | |
objet-fonction implémentant x + y (classe générique) | |
objet-fonction implémentant x - y (classe générique) | |
objet-fonction implémentant x * y (classe générique) | |
objet-fonction implémentant x / y (classe générique) | |
objet-fonction implémentant x % y (classe générique) | |
objet-fonction implémentant -x (classe générique) | |
Comparaisons | |
objet-fonction implémentant x == y (classe générique) | |
objet-fonction implémentant x != y (classe générique) | |
objet-fonction implémentant x > y (classe générique) | |
objet-fonction implémentant x < y (classe générique) | |
objet-fonction implémentant x >= y (classe générique) | |
objet-fonction implémentant x <= y (classe générique) | |
Opérations logiques | |
objet-fonction implémentant x && y (classe générique) | |
objet-fonction implémentant x || y (classe générique) | |
objet-fonction implémentant !x (classe générique) | |
Opérations bit-à-bit | |
objet-fonction implémentant x & y (classe générique) | |
objet-fonction implémentant x | y (classe générique) | |
objet-fonction implémentant x ^ y (classe générique) | |
Négations | |
foncteur retournant le complémentaire d'un foncteur existant, de type prédicat unaire (classe générique) | |
foncteur retournant le complémentaire d'un foncteur existant, de type prédicat binaire (classe générique) | |
fonction permettant de construire un objet de type std::unary_negate (fonction générique) | |
fonction permettant de construire un objet de type std::binary_negate (fonction générique) |
[modifier] Obsolète en C++11
L'ancien mécanisme de foncteurs est maintenant obsolète en C++11, notamment:
Classes de base pour créer des foncteurs | |
(obsolète) |
classe de base pour définir des foncteurs à 1 paramètre (classe générique) |
(obsolète) |
classe de base pour définir des foncteurs à 2 paramètres (classe générique) |
Liaison de paramètres, application partielle | |
(obsolète) (obsolète) |
foncteur contenant une fonction binaire et un des deux paramètres (classe générique) |
(obsolète) (obsolète) |
retourne un foncteur unaire résultant de l'application partielle d'un foncteur binaire (fonction générique) |
Adaptateurs de fonction | |
(obsolète) |
permet de créer un foncteur à partir d'une fonction binaire (classe générique) |
(obsolète) |
permet de créer un foncteur à partir d'une fonction unaire (classe générique) |
(obsolète) |
crée un foncteur à partir d'une fonction (fonction générique) |
(obsolète) (obsolète) (obsolète) (obsolète) |
permet de créer un foncteur à partir d'une fonction membre (classe générique) |
(obsolète) |
crée un foncteur à partir d'une fonction membre (fonction générique) |
(obsolète) (obsolète) (obsolète) (obsolète) |
permet de créer un foncteur à partir d'une fonction membre (classe générique) |
(obsolète) |
crée un foncteur à partir d'une fonction membre (fonction générique) |