Passer des fonctions de membre de classe en tant que rappels
Lors de l'utilisation d'une API qui nécessite un pointeur de fonction comme rappel, des difficultés peuvent survenir lors de la tentative de transmission une fonction membre de classe à partir de la classe elle-même. Cet article explore les subtilités de ce problème et propose des solutions pour le surmonter efficacement.
Énoncé du problème
Considérez une classe hypothétique, CLoggersInfra, qui contient une fonction membre, RedundancyManagerCallBack. . Vous cherchez à utiliser cette fonction membre comme rappel au sein d'une autre fonction API Init, mais vous rencontrez l'erreur de compilation suivante :
Error 8 error C3867: 'CLoggersInfra::RedundancyManagerCallBack': function call missing argument list; use '&CLoggersInfra::RedundancyManagerCallBack' to create a pointer to member
Explorer le problème
Le l'erreur provient d'une caractéristique fondamentale des fonctions membres en C . Bien qu'ils semblent appartenir exclusivement à une instance de classe particulière, ils reçoivent intrinsèquement un paramètre caché supplémentaire, qui est une référence à l'instance de classe elle-même. Ceci est communément appelé le pointeur « ce ».
Solutions expliquées
1. L'utilisation de Boost
Boost, une bibliothèque tierce, fournit un outil puissant pour résoudre ce problème : boost::bind. Il vous permet de créer une nouvelle fonction qui « verrouille » un paramètre spécifique. Dans ce cas, le paramètre caché "this" peut être verrouillé sur une instance de classe particulière, créant ainsi une nouvelle fonction avec un seul paramètre visible.
2. Encapsulation avec un objet personnalisé
Vous pouvez également créer un objet personnalisé qui accepte une référence à l'instance de classe et fournit une méthode "run" ou "execute" qui appelle la fonction membre avec les paramètres fournis . Cependant, cette approche nécessite de modifier l'API pour accepter votre objet personnalisé au lieu d'un pointeur de fonction brut.
3. Fonctions Lambda C 11
En C 11 et versions ultérieures, les fonctions lambda offrent une solution plus élégante. Ils peuvent capturer le pointeur « this », éliminant ainsi le besoin d'un objet personnalisé distinct. Les fonctions Lambda offrent un moyen concis et pratique d'obtenir la fonctionnalité souhaitée.
Conclusion
Comprendre la nature inhérente des fonctions membres et leur paramètre caché "this" est crucial pour les transmettre avec succès comme rappels. En tirant parti des capacités des fonctions boost::bind ou C 11 lambda, vous pouvez résoudre efficacement les erreurs de compilation et utiliser les fonctions membres de la classe comme fonctions de rappel en douceur.
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!