Namespaces
Variants

Function objects

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )

Un objet fonction est tout objet pour lequel l'opérateur d'appel de fonction est défini. C++ fournit de nombreux objets fonction intégrés ainsi qu'une prise en charge pour la création et la manipulation de nouveaux objets fonction.

Table des matières

Invocation de fonction

L'opération d'exposition uniquement INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) est définie comme suit :

Soit le type Obj le type non qualifié de arg_0 (c'est-à-dire, std:: remove_cv < std:: remove_reference < decltype ( arg_0 ) > :: type > :: type )

  • ( obj. * f ) ( arg_1, arg_2, ..., arg_N ) (invoquer la fonction membre sur l'objet).
  • ( obj. get ( ) . * f ) ( arg_1, arg_2, ..., arg_N ) (invoquer la fonction membre sur l'objet spécialement référencé).
  • Sinon
  • ( ( * obj ) . * f ) ( arg_1, arg_2, ..., arg_N ) (invoquer la fonction membre sur l'objet déréférencé).
  • obj. * mptr (accède au membre de données de l'objet).
  • obj. get ( ) . * mptr (accède au membre de données de l'objet référencé spécialement).
  • Sinon
  • ( * obj ) . * mptr (accède au membre de données de l'objet déréférencé).
  • Sinon
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) est équivalent à f ( arg_0, arg_1, arg_2, ..., arg_N ) (invoquer l'objet appelable).


L'opération d'exposition uniquement INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) est définie comme suit :

  • Si R est (éventuellement qualifié cv) void
  • static_cast < void > ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) ) .
**Note:** Le code C++ et les balises HTML n'ont pas été traduits conformément aux instructions. Le seul texte à traduire était le point final à la fin de l'élément de liste, qui a été conservé en anglais car il fait partie intégrante de l'exemple de code C++.
  • Sinon
  • INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) implicitement converti en R .

Soit le type Actual défini comme decltype ( INVOKE ( f, arg_0, arg_1, arg_2, ..., arg_N ) )

  • INVOKE<R> ( f, arg_0, arg_1, arg_2, ..., arg_N ) est mal formé.
(depuis C++23)
(depuis C++11)


std::invoke et std::invoke_r (depuis C++23) peuvent invoquer tout objet Callable avec des arguments donnés selon les règles de INVOKE et INVOKE<R> (depuis C++23) .

(C++17) (C++23)
invoque tout Callable objet avec les arguments donnés et possibilité de spécifier le type de retour (depuis C++23)
(modèle de fonction)

Enveloppes de fonction

Ces classes d'encapsulation polymorphes offrent une prise en charge pour le stockage d'objets fonction arbitraires.

(C++11)
enveloppe copiable de tout objet appelable copiable
(modèle de classe)
enveloppe non-copiable de tout objet appelable prenant en charge les qualificateurs dans une signature d'appel donnée
(modèle de classe)
enveloppe copiable de tout objet appelable copiable prenant en charge les qualificateurs dans une signature d'appel donnée
(modèle de classe)
enveloppe non-propriétaire de tout objet appelable
(modèle de classe)
l'exception levée lors de l'appel d'un std::function vide
(classe)
(C++11)
crée un objet fonction à partir d'un pointeur vers un membre
(modèle de fonction)

Identité

std::identity est l'objet fonction identité : il retourne son argument inchangé.

(C++20)
objet fonction qui retourne son argument inchangé
(classe)

Application partielle de fonction

std::bind_front et std::bind fournissent un support pour l' application partielle de fonctions , c'est-à-dire la liaison d'arguments à des fonctions pour produire de nouvelles fonctions.

(C++20) (C++23)
lie un nombre variable d'arguments, dans l'ordre, à un objet fonction
(modèle de fonction)
(C++11)
lie un ou plusieurs arguments à un objet fonction
(modèle de fonction)
indique qu'un objet est une expression std::bind ou peut être utilisé comme telle
(modèle de classe)
indique qu'un objet est un espace réservé standard ou peut être utilisé comme tel
(modèle de classe)
Défini dans l'espace de noms std::placeholders
espaces réservés pour les arguments non liés dans une expression std::bind
(constante)

Négateurs

std::not_fn crée un objet fonction qui nie le résultat de l'objet appelable qui lui est passé.

(C++17)
crée un objet fonction qui retourne le complément du résultat de l'objet fonction qu'il contient
(modèle de fonction)

Chercheurs

Des chercheurs implémentant plusieurs algorithmes de recherche de chaînes sont fournis et peuvent être utilisés directement ou avec std::search .

implémentation de l'algorithme de recherche standard de la bibliothèque C++
(modèle de classe)
implémentation de l'algorithme de recherche Boyer-Moore
(modèle de classe)
implémentation de l'algorithme de recherche Boyer-Moore-Horspool
(modèle de classe)

Enveloppes de référence

Les références enveloppées permettent aux arguments de référence d'être stockés dans des objets fonction copiables :

CopyConstructible et CopyAssignable wrapper de référence
(modèle de classe)
(C++11) (C++11)
crée un std::reference_wrapper avec un type déduit de son argument
(modèle de fonction)
obtient le type de référence encapsulé dans std::reference_wrapper
(modèle de classe)

Objets fonction transparents

Conteneurs associatifs et conteneurs associatifs non ordonnés (depuis C++20) fournissent des opérations de recherche hétérogène et d'effacement (depuis C++23) , mais elles ne sont activées que si le type d'objet fonction fourni T est transparent : l'identifiant qualifié T::is_transparent est valide et désigne un type.

Tous les types d'objets fonction transparents dans la bibliothèque standard définissent un type imbriqué is_transparent . Cependant, les types d'objets fonction transparents définis par l'utilisateur n'ont pas besoin de fournir directement is_transparent comme type imbriqué : il peut être défini dans une classe de base, tant que T::is_transparent satisfait à l'exigence de transparence mentionnée ci-dessus.

(depuis C++14)

Objets fonction d'opérateur

C++ définit les objets fonction suivants qui représentent les opérations arithmétiques et logiques courantes.

Les spécialisations void déduisent leurs types de paramètres et types de retour de leurs arguments, elles sont toutes transparentes .

(depuis C++14)
Opérations arithmétiques
objet fonction implémentant x + y
(modèle de classe)
objet fonction implémentant x + y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x - y
(modèle de classe)
objet fonction implémentant x - y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x * y
(modèle de classe)
objet fonction implémentant x * y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x / y
(modèle de classe)
objet fonction implémentant x / y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x % y
(modèle de classe)
objet fonction implémentant x % y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant - x
(modèle de classe)
objet fonction implémentant - x avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
Comparaisons
objet fonction implémentant x == y
(modèle de classe)
objet fonction implémentant x == y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x ! = y
(modèle de classe)
objet fonction implémentant x ! = y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x > y
(modèle de classe)
objet fonction implémentant x > y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x < y
(modèle de classe)
objet fonction implémentant x < y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x >= y
(modèle de classe)
objet fonction implémentant x >= y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x <= y
(modèle de classe)
objet fonction implémentant x <= y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
Opérations logiques
objet fonction implémentant x && y
(modèle de classe)
objet fonction implémentant x && y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x || y
(modèle de classe)
objet fonction implémentant x || y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant ! x
(modèle de classe)
objet fonction implémentant ! x déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
Opérations bit à bit
objet fonction implémentant x & y
(modèle de classe)
objet fonction implémentant x & y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x | y
(modèle de classe)
objet fonction implémentant x | y déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)
objet fonction implémentant x ^ y
(modèle de classe)
objet fonction implémentant x ^ y avec déduction des types de paramètres et de retour
(spécialisation de modèle de classe)
(C++14)
objet fonction implémentant ~x
(modèle de classe)
objet fonction implémentant ~x déduisant les types de paramètres et de retour
(spécialisation de modèle de classe)


Objets fonction de comparaison contraints

Les objets fonction de comparaison suivants sont contraints .

  • Les opérateurs d'égalité ( ranges::equal_to et ranges::not_equal_to ) exigent que les types des arguments satisfassent equality_comparable_with .
  • Les opérateurs relationnels ( ranges::less , ranges::greater , ranges::less_equal , et ranges::greater_equal ) exigent que les types des arguments satisfassent totally_ordered_with .
  • L'opérateur de comparaison à trois voies ( compare_three_way ) exige que le type modélise three_way_comparable_with .

Tous ces objets fonction sont transparents .

objet fonction contraint implémentant x == y
(classe)
objet fonction contraint implémentant x ! = y
(classe)
objet fonction contraint implémentant x < y
(classe)
objet fonction contraint implémentant x > y
(classe)
objet fonction contraint implémentant x <= y
(classe)
objet fonction contraint implémentant x >= y
(classe)
objet fonction contraint implémentant x <=> y
(classe)
(depuis C++20)


Éléments d'assistance

Les éléments suivants, à exposition uniquement, sont utilisés pour plusieurs composants de la bibliothèque standard mais ils ne font pas partie de l'interface de la bibliothèque standard.

template < class Fn, class ... Args >

concept /*appelable*/ =
requires ( Fn && fn, Args && ... args ) {
std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) ;

} ;
(1) ( exposition uniquement* )
template < class Fn, class ... Args >

concept /*appelable-sans-exception*/ =
/*appelable*/ < Fn, Args... > &&
requires ( Fn && fn, Args && ... args ) {
{ std:: forward < Fn > ( fn ) ( std:: forward < Args > ( args ) ... ) } noexcept ;

} ;
(2) ( exposition uniquement* )
template < class Fn, class ... Args >
using /*type-resultat-appel*/ = decltype ( std:: declval < Fn > ( ) ( std:: declval < Args > ( ) ... ) ) ;
(3) ( exposition uniquement* )
template < const auto & T >
using /*type-degrade*/ = decltype ( auto ( T ) ) ;
(4) ( exposition uniquement* )
(depuis C++26)


Anciens binders et adapteurs

Plusieurs utilitaires qui fournissaient un support fonctionnel précoce sont obsolètes et supprimés :

Base
(déprécié en C++11) (supprimé en C++17)
classe de base de fonction unaire compatible avec les adaptateurs
(modèle de classe)
(obsolète en C++11) (supprimé en C++17)
classe de base de fonction binaire compatible avec les adaptateurs
(modèle de classe)
Binders
(déprécié en C++11) (supprimé en C++17)
objet fonction contenant une fonction binaire et l'un de ses arguments
(modèle de classe)
(déprécié en C++11) (supprimé en C++17)
lie un argument à une fonction binaire
(modèle de fonction)
Adaptateurs de fonctions
(obsolète en C++11) (supprimé en C++17)
adaptateur compatible pour un pointeur vers une fonction unaire
(modèle de classe)
(obsolète en C++11) (supprimé en C++17)
wrapper compatible avec les adaptateurs pour un pointeur vers une fonction binaire
(modèle de classe)
(obsolète en C++11) (supprimé en C++17)
crée un wrapper de fonction compatible adaptateur à partir d'un pointeur de fonction
(modèle de fonction)
(obsolète en C++11) (supprimé en C++17)
wrapper pour un pointeur vers une fonction membre nullaire ou unaire, appelable avec un pointeur vers un objet
(modèle de classe)
(obsolète en C++11) (supprimé en C++17)
crée un wrapper à partir d'un pointeur vers une fonction membre, appelable avec un pointeur vers un objet
(modèle de fonction)
wrapper pour un pointeur vers une fonction membre nullaire ou unaire, appelable avec une référence à l'objet
(modèle de classe)
(obsolète en C++11) (supprimé en C++17)
crée un wrapper à partir d'un pointeur vers une fonction membre, appelable avec une référence à l'objet
(modèle de fonction)
(obsolète en C++17) (supprimé en C++20)
objet fonction wrapper renvoyant le complément du prédicat unaire qu'il contient
(modèle de classe)
(obsolète en C++17) (supprimé en C++20)
fonction wrapper retournant le complément du prédicat binaire qu'elle contient
(modèle de classe)
(obsolète en C++17) (supprimé en C++20)
construit un objet std::unary_negate personnalisé
(modèle de fonction)
(obsolète en C++17) (supprimé en C++20)
construit un objet std::binary_negate personnalisé
(modèle de fonction)
(jusqu'à C++20)

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 185 C++98 l'utilisation d'objets fonction améliorait l'efficacité du programme supprimé l'affirmation
LWG 660 C++98 les objets fonction pour les opérations bit à bit manquaient ajoutés
LWG 2149 C++98 les objets fonction prenant un ou deux arguments devaient
fournir des types imbriqués pour désigner les types d'arguments et de résultat
non requis
LWG 2219 C++11 INVOKE ne gérait pas correctement std::reference_wrapper gère correctement
LWG 2420 C++11 INVOKE<R> ne rejetait pas la valeur de retour si R est void rejette la valeur de retour dans ce cas
LWG 2926
( P0604R0 )
C++11 la syntaxe de l'opération INVOKE avec un type de
retour R était INVOKE ( f, t1, t2, ..., tN, R )
changé en
INVOKE<R> ( f, t1, t2, ..., tN )
LWG 3655 C++11 INVOKE ne gérait pas correctement les unions
en raison de la résolution de LWG issue 2219
gère correctement