Maison > développement back-end > C++ > le corps du texte

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
389 Les gens l'ont consulté

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

Deriving a Plain Function Pointer from Boost::function

In some scenarios, it may be necessary to pass a Boost::function to a method that anticipates a standard function pointer (demonstrating the same signature). This can lead to compilation errors.

Conversion Errors

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

Avoiding Boost::function

Eliminating Boost::function and referencing the bound functor immediately leads to analogous errors:

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

Proposed Solution

The commonly accepted solution is limited as it only operates successfully in trivial cases. A more effective approach involves employing a shim function, which abides by the callback signature, ascertains the applicable Boost::function to invoke, and executes it.

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

This method ensures compatibility between Boost::function and Boost::bind, enabling their seamless integration with C callbacks. However, if the callback signature lacks a user data pointer, this approach becomes infeasible. Nonetheless, such callback structures are inherently limited in practical applications and warrant revision.

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