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 :
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 :
Autres considérations :
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!