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);
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!