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.
typedef void TriggerProc_type(Variable*, void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)>& triggerProc ... InitVariable(triggerProc); // Error: cannot convert parameter 1
É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 *)'
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!