Maison >développement back-end >C++ >Comment convertir un boost :: function en un pointeur de fonction simple ?

Comment convertir un boost :: function en un pointeur de fonction simple ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-11 18:08:03950parcourir

How to Convert a boost::function to a Plain Function Pointer?

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, &amp;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!

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