Maison > développement back-end > C++ > Comment fonctionnent les rappels en C et quelles sont leurs différentes utilisations ?

Comment fonctionnent les rappels en C et quelles sont leurs différentes utilisations ?

Mary-Kate Olsen
Libérer: 2024-12-14 06:20:11
original
413 Les gens l'ont consulté

How Do Callbacks Work in C  , and What Are Their Various Uses?

Les rappels et leurs diverses utilisations en C

En C , un rappel est un appelable (discuté plus tard) accepté par une classe ou une fonction, utilisé pour personnaliser la logique actuelle en fonction du rappel fourni.

Raisons d'utilisation Rappels :

  • Pour écrire du code générique indépendant de la logique dans la fonction appelée, permettant sa réutilisation avec différents rappels.
  • Pour informer les appelants d'événements spécifiques, en activant la statique et la compilation -flexibilité temporelle.

Que sont les Callables en C ?

  • Pointeurs de fonction (y compris les pointeurs vers les fonctions membres)
  • std::objets de fonction
  • Expressions lambda
  • Expressions de liaison
  • Objets de fonction (classes avec opérateur d'appel de fonction surchargé Operator())

Écriture et appel de rappels :

Pointeurs de fonction :

  • Notation de type : return_type (*)(parameter_type_1, paramètre_type_2, paramètre_type_3)
  • Notation d'appel de rappel : function_pointer(argument)
  • Notation d'utilisation de rappel : function(argument_list, function_pointer)

Pointeur vers le membre Fonction :

  • Notation de type : return_type (class_type::*)(parameter_type_1, paramètre_type_2, paramètre_type_3)
  • Notation d'appel de rappel : (class_instance.*member_function_pointer)(argument)
  • Callback Utiliser la notation : function(argument_list, class_instance, member_function_pointer)

std::function Objets :

  • Type Notation : std::function
  • Notation d'appel de rappel : function_object()
  • Utilisation du rappel Notation : fonction(argument_list, function_object)

Exemples utilisant std::function:

Code généralisant :

template<class R, class T>
void stdf_transform_every_int_templ(int *v, unsigned const n, std::function<R(T)> fp) {
  for (unsigned i = 0; i < n; ++i) {
    v[i] = fp(v[i]);
  }
}
Copier après la connexion

Modèle Rappels :

template<class F>
void transform_every_int_templ(int *v, unsigned const n, F f) {
  for (unsigned i = 0; i < n; ++i) {
    v[i] = f(v[i]);
  }
}
Copier après la connexion

Implémentation du nom de type :

template <class T>
std::string type_name() {
  typedef typename std::remove_reference<T>::type TR;
  std::unique_ptr<char, void(*)(void*)> own
    (abi::__cxa_demangle(typeid(TR).name(), nullptr,
    nullptr, nullptr), std::free);
  std::string r = own != nullptr?own.get():typeid(TR).name();
  if (std::is_const<TR>::value)
    r += " const";
  if (std::is_volatile<TR>::value)
    r += " volatile";
  if (std::is_lvalue_reference<T>::value)
    r += " &amp;&";
  else if (std::is_rvalue_reference<T>::value)
    r += " &amp;&amp;";
  return r;
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal