Maison > développement back-end > C++ > Comment transmettre un « boost :: function » à un rappel C en attendant un pointeur de fonction simple ?

Comment transmettre un « boost :: function » à un rappel C en attendant un pointeur de fonction simple ?

Susan Sarandon
Libérer: 2024-11-09 14:38:02
original
775 Les gens l'ont consulté

How to Pass a `boost::function` to a C Callback Expecting a Plain Function Pointer?

Rétrograder Boost::function à un pointeur de fonction simple

Boost::function est un outil polyvalent pour gérer les pointeurs de fonction, mais il peut être difficile à utiliser avec des rappels C qui attendent des pointeurs de fonction simples. Cet article explore les complexités de ce problème et propose une solution robuste utilisant une fonction shim.

Le problème survient lorsque l'on tente de transmettre une fonction boost::liée directement à une méthode attendant un pointeur de fonction simple avec la même signature. . Cela entraîne des erreurs de compilation en raison de la différence dans les représentations du pointeur de fonction.

La réponse acceptée suggère d'utiliser boost::function::target() pour récupérer le pointeur de fonction sous-jacent, mais cette approche a des limites. Cela ne fonctionne que pour les cas triviaux où la fonction boost::function a été construite avec un pointeur de fonction qui peut être lié à un rappel C.

Pour résoudre ce problème, une approche plus fiable consiste à créer une fonction shim qui répond la signature de rappel et distribue les appels à la fonction boost:: appropriée. Ceci peut être réalisé en stockant le pointeur boost::function en tant que données utilisateur dans la fonction de rappel.

Voici un exemple de la façon dont cette approche peut être utilisée :

typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);

void MyCallback(int x, void* userData) {
  boost::function<void(int)> pfn = static_cast<boost::function<void(int)>>(userData);
  pfn(x);
}

boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
Copier après la connexion

Cette solution fournit une manière propre et fiable d'utiliser boost::function et boost::bind avec les rappels C, même lorsque les signatures de rappel n'incluent pas de pointeurs de données utilisateur.

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!

source:php.cn
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