Maison > développement back-end > C++ > Comment passer une fonction Boost :: à une méthode attendant un pointeur de fonction ?

Comment passer une fonction Boost :: à une méthode attendant un pointeur de fonction ?

Mary-Kate Olsen
Libérer: 2024-11-14 16:44:02
original
459 Les gens l'ont consulté

How to Pass a Boost::function to a Method Expecting a Function Pointer?

Dérivation d'un pointeur de fonction simple à partir de Boost::function

Dans certains scénarios, il peut être nécessaire de transmettre un Boost::function à une méthode qui anticipe une norme pointeur de fonction (démontrant la même signature). Cela peut entraîner des erreurs de compilation.

Erreurs de conversion

typedef void TriggerProc_type(Variable*, void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)>& triggerProc ...
InitVariable(triggerProc);

// Error: cannot convert parameter 1
Copier après la connexion

Éviter Boost::function

Éliminer Boost::function et référencer le foncteur lié entraîne immédiatement des erreurs analogues :

error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter
1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
Copier après la connexion

Solution proposée

La solution communément acceptée est limitée car il ne fonctionne avec succès que dans des cas triviaux. Une approche plus efficace consiste à utiliser une fonction shim, qui respecte la signature de rappel, détermine la fonction Boost:: applicable à invoquer et l'exécute.

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 méthode garantit la compatibilité entre Boost::function et Boost::bind, permettant leur intégration transparente avec les rappels C. Cependant, si la signature de rappel ne contient pas de pointeur de données utilisateur, cette approche devient irréalisable. Néanmoins, de telles structures de rappel sont intrinsèquement limitées dans les applications pratiques et justifient une révision.

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