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

Comment transmettre en toute sécurité un « boost :: function » à un pointeur de fonction simple ?

Linda Hamilton
Libérer: 2024-11-10 13:19:03
original
123 Les gens l'ont consulté

How to Safely Pass a `boost::function` to a Plain Function Pointer?

Rétrogradation de Boost::function à un pointeur de fonction simple

Problème :

Passer un boost::function en tant que pointeur de fonction simple avec la même signature vers une méthode qui en nécessite une peut entraîner des erreurs, telles que C2664.

Résolution :

Bien que certaines réponses suggèrent d'utiliser target() pour récupérer un pointeur à partir d'une fonction boost::, cela ne fonctionne que pour les cas triviaux où le paramètre initial L'objet lié était éligible pour une liaison à un rappel C.

Pour les cas non triviaux, le mécanisme sous-jacent d'une fonction boost:: nécessite plusieurs des pointeurs, pas un seul. Par conséquent, une solution plus robuste consiste à créer une fonction shim qui est conforme à la signature de rappel et délègue l'appel à la fonction boost::stockée en tant que données utilisateur.

Exemple :

// Shim function for callback
typedef void (*CallbackType)(int x, void* user_data);
void MyCallback(int x, void* userData) {
    boost::function<void(int)>& pfn = static_cast<boost::function<void(int)> &>(userData);
    pfn(x);
}

// Usage
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);
Copier après la connexion

Cette approche permet d'utiliser boost::function avec des rappels C qui incluent les données utilisateur. Cependant, si la signature de rappel ne dispose pas d'un pointeur de données utilisateur, elle peut nécessiter une refonte complète pour devenir utilisable dans la plupart des circonstances.

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