Maison >développement back-end >C++ >Comment les rappels peuvent-ils améliorer la fonctionnalité du code C ?

Comment les rappels peuvent-ils améliorer la fonctionnalité du code C ?

DDD
DDDoriginal
2024-12-10 18:22:12503parcourir

How Can Callbacks Enhance C   Code Functionality?

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(&amp;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(&amp;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