


Comment effectuer un cast entre un pointeur void* et un pointeur vers une fonction membre en C ?
Casting entre void* et un pointeur vers une fonction membre
Lorsque l'on travaille avec l'interopérabilité C/C, on peut rencontrer des difficultés en essayant de caster entre un pointeur void et un pointeur vers une fonction membre. Ce problème survient souvent lorsqu'il s'agit de fermetures dans des langages comme Lua, où les données utilisateur sont stockées sous forme de pointeurs vides.
Problème :
Conversion de void* vers un pointeur vers un la fonction membre en C n'est pas valide en raison des différences fondamentales dans leurs représentations en mémoire. Les pointeurs vers les membres contiennent des informations supplémentaires qui ne sont pas accessibles via les pointeurs classiques.
Solution :
Pour contourner ce problème, envisagez les options suivantes :
1. Enveloppez la fonction membre dans une fonction libre :
- Créez une fonction libre qui accepte l'instance d'objet comme premier argument et les paramètres de la fonction membre comme arguments suivants.
- Retour l'adresse de cette fonction gratuite au lieu du pointeur vers le membre.
Extrait de code :
<code class="cpp">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>
2. Utilisez un objet fonction :
- Utilisez une technique similaire à mem_fun de Boost.Bind pour créer un objet fonction qui encapsule la fonction membre.
- Modèlez l'objet fonction pour prendre en charge différents types d'objets.
Autres considérations :
- Assurez-vous du contrôle sur les données utilisateur renvoyées par lua_touserdata car elles ne peuvent pas contenir de pointeur vers un membre valide. .
- Envisagez d'envelopper la fonction membre dans une méthode de classe ou une fonction statique si vous avez besoin d'un état supplémentaire.
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!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Quels sont les types de valeurs renvoyées par les fonctions du langage C? Qu'est-ce qui détermine la valeur de retour?

Gulc: Cibliothèque C construite à partir de zéro

C Fonction Langue Format de lettre ÉTAPES DE CONVERSION DE CAS

Quelles sont les définitions et les règles d'appel des fonctions du langage C et quelles sont les

Où est la valeur de retour de la fonction de langue C stockée en mémoire?

Utilisation distincte et partage de phrases

Comment utiliser efficacement les algorithmes du STL (trier, trouver, transformer, etc.)?

Comment fonctionne la bibliothèque de modèle standard C (STL)?
