Maison >développement back-end >C++ >Comment convertir un boost :: function en un pointeur de fonction simple ?
Rétrograder boost::function à un pointeur de fonction simple
L'un des défis courants rencontrés lorsqu'on traite boost::function est la nécessité pour le convertir en un simple pointeur de fonction. Cela se produit lors de l'interaction avec du code en attendant un pointeur de fonction avec une signature spécifique, alors que la fonction disponible est encapsulée dans boost::function.
Le problème
Considérez ce qui suit code :
typedef void TriggerProc_type(Variable*,void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)> triggerProc ... InitVariable(triggerProc);
La compilation de ce code donnera ce qui suit erreur :
error C2664: 'InitVariable' : cannot convert parameter 1 from 'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
La solution
La solution suggérée à ce problème réside dans la création d'une fonction shim conforme à la signature de rappel attendue :
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);
Dans cet exemple, MyCallback sert de fonction shim, convertissant la fonction boost::en un rappel compatible. Le paramètre de données utilisateur est utilisé pour stocker l'objet boost::function, permettant à MyCallback d'y accéder et de l'exécuter à l'aide d'un simple cast.
Pourquoi la liaison directe n'est pas toujours réalisable
Il est important de noter que même si la liaison directe du foncteur lié est une option, elle n'est pas toujours adaptée. Boost non trivial ::fonction< > les objets nécessitent généralement plusieurs pointeurs, ce qui rend la conversion directe en un rappel de style C difficile.
Conclusion
En utilisant une fonction de calage comme MyCallback, il devient possible de relier efficacement l'écart entre boost::function et les rappels de style C. Cette approche permet une intégration transparente et permet l'utilisation de boost::function dans des scénarios où des pointeurs de fonction simples sont requis.
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!