Maison >développement back-end >C++ >Comment puis-je implémenter des rappels C à l'aide de membres de classe avec des modèles et des fonctions Lambda ?

Comment puis-je implémenter des rappels C à l'aide de membres de classe avec des modèles et des fonctions Lambda ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-07 07:32:15529parcourir

How Can I Implement C   Callbacks Using Class Members with Templates and Lambda Functions?

Rappel C à l'aide d'un membre de classe : utilisation de modèles et de fonctions Lambda

Le concept de fonctions de rappel est largement utilisé en C, permettant à une fonction de en invoquer un autre lors de la survenance d’un événement spécifique. Cet article se concentre sur la façon d'implémenter des rappels à l'aide de membres de classe, garantissant ainsi la compatibilité entre plusieurs classes.

Traditionnellement, les fonctions de rappel sont déclarées comme méthodes statiques au sein de la classe. Cependant, cette approche nécessite de passer un pointeur vers l’instance de classe, ce qui peut s’avérer fastidieux. Une solution plus efficace consiste à adopter les capacités de C 11, à savoir std::function et std::bind.

Au lieu d'utiliser des méthodes statiques, vous pouvez exploiter std::function, qui sert d'objet fonction. en prenant un entier comme argument. Pour le lier à une fonction spécifique au sein d'une classe, utilisez std::bind. Le gestionnaire d'événements peut alors accepter std::function comme entrée, éliminant ainsi le besoin de transmettre des arguments d'instance explicites.

Par exemple, considérons l'extrait de code suivant :

class EventHandler {
public:
  void addHandler(std::function<void(int)> callback) {
    // ...
  }
};

class MyClass {
public:
  void Callback(int x);
  // ...
};

Dans ce scénario, la méthode MyClass :: Callback prend un argument entier et ne nécessite pas de déclaration statique. Pour ajouter un gestionnaire, utilisez simplement std::bind:

EventHandler handler;
MyClass myClass;

using namespace std::placeholders;

handler.addHandler(std::bind(&MyClass::Callback, &myClass, _1));

Cette approche permet au même gestionnaire d'événements de travailler avec plusieurs classes, garantissant la flexibilité et la réutilisabilité du code.

De plus, vous pouvez utilisez les fonctions lambda C 11 pour améliorer la simplicité et l'élégance des rappels :

handler.addHandler([](int x) { std::cout << "x is " << x << '\n'; });

En adoptant ces méthodes, vous pouvez implémenter efficacement rappels utilisant des membres de classe, obtenant à la fois la compatibilité et la concision du code.

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