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);
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!