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

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 20:48:30194parcourir

How to Cast Between a void* Pointer and a Pointer to a Member Function in 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!

Déclaration:
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