Maison > développement back-end > C++ > Comment effectuer un cast entre void* et un pointeur vers une fonction membre en C ?

Comment effectuer un cast entre void* et un pointeur vers une fonction membre en C ?

Mary-Kate Olsen
Libérer: 2024-10-29 07:18:02
original
1068 Les gens l'ont consulté

How to Cast Between void* and a Pointer to Member Function in C  ?

Difficultés de conversion entre void* et un pointeur vers une fonction membre

Lorsqu'ils travaillent avec des bibliothèques C, les développeurs rencontrent souvent des difficultés lors de la conversion entre void* et un pointeur vers une fonction membre . Cet article vise à aborder un problème spécifique lié à ce sujet et à fournir une solution viable.

Énoncé du problème

Dans le but de faciliter la liaison d'objets C à un interpréteur Lua, une fonction, call_int_function, a été conçu avec GCC 4.4. Cependant, la ligne reinterpret_cast)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))) a généré une erreur de compilation, indiquant une conversion non valide de void vers un pointeur vers la fonction membre.

Cause de l'erreur

GCC considère la conversion de void vers void (T::)(int, int) invalide car les pointeurs vers les membres sont distincts des pointeurs réguliers. Ce ne sont pas des adresses au sens traditionnel du terme, et leur implémentation varie considérablement selon les compilateurs.

Solution alternative

La solution à ce problème réside dans l'enveloppement de la fonction membre dans une fonction régulière. La fonction libre doit prendre l'objet comme premier argument. Cette approche élimine le besoin de convertir en void* et permet l'utilisation d'un pointeur régulier vers le type de fonction.

Fonction mise à jour

Voici une version réécrite de call_int_function utilisant la solution proposée :

<code class="cpp">template <class T>
int call_int_function(lua_State *L) {
    void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
    T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));

    method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3));
    return 0;
}</code>
Copier après la connexion

Conclusion

En encapsulant la fonction membre dans une fonction régulière, le besoin de transtypage en void* est éliminé, résolvant ainsi l'erreur de compilation rencontrée dans GCC 4.4. Cette approche conserve la fonctionnalité prévue tout en respectant les limitations et les exigences du casting de pointeur vers membre.

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