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
Mary-Kate Olsenoriginal
2024-11-14 16:44:02461parcourir

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

É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 *)'

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

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!

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