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.
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
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.
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.
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>
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!