Rappels en C
Les rappels sont des objets appelables acceptés par une fonction ou une classe, utilisés pour personnaliser la logique actuelle en fonction du rappel.
Quand utiliser Rappels :
- Écriture de code générique indépendant de la logique de la fonction appelée.
- Activation du comportement d'exécution dynamique (par exemple, modification de la fonctionnalité d'un bouton dans un jeu).
- Notifier les appelants d'événements spécifiques.
Callables en C 11 :
Les rappels peuvent prendre diverses formes, toutes considérées comme « appelables » :
- Pointeurs de fonction
- std::objets de fonction
- Expressions lambda
- Expressions de liaison
- Objets fonction (classes avec opérateur d'appel de fonction surchargé)
Notation de rappel :
1. Pointeurs de fonction
- typedef return_type (*f_int_t) (int);
- int (* foo_p)(int) = &foo;
- int foobar (int x, int (*moo)(int));
- int foobar (int x, f_int_t moo);
2. Pointeur vers la fonction membre
- typedef int (C::* f_C_int_t) (int x);
- int (C::* C_foo_p)(int) = & C::foo;
- int C_foobar (int x, C const &c, int (C::*moo)(int));
- int C_foobar (int x, C const &c, f_C_int_t moo);
3. std::function Objets
- std::function stdf_foo = &foo;
- int stdf_foobar (int x, std::function moo);
4. Rappels basés sur un modèle
Cela permet un code plus générique.
- template void stdf_transform_every_int_templ(int * v, unsigned const n, std::function fp);
- template void transform_every_int_templ(int * v, unsigned const n, F f);
Types de rappel compatibles :
-
Pointeurs de fonction : Pointeurs de fonction
-
std::function Objets : Pointeurs de fonction, expressions lambda, expressions de liaison, objets de fonction
-
Rappels modèles : Tout type appelable (par exemple, expressions lambda, expressions de liaison, fonction objets)
Exemples :
-
Exemple de pointeur de fonction :
void tranform_every_int(int * v, unsigned n, int (*fp)(int));
int double_int(int x) { return 2*x; }
int square_int(int x) { return x*x; }
-
std::function Objet Exemple :
void stdf_tranform_every_int(int * v, unsigned n, std::function<int(int)> fp);
int a[5] = {1, 2, 3, 4, 5};
stdf_tranform_every_int(&a[0], 5, Meow{8});
-
Exemple de rappel modèle :
int nine_x_and_y (int x, int y) { return 9*x + y; }
using std::placeholders::_1;
stdf_transform_every_int_templ(&a[0], 5, std::bind(nine_x_and_y, _1, 4));
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration:Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn