La conversion entre les void * et un pointeur de fonction membre

Je suis actuellement en utilisant GCC 4.4, et je suis tout à fait avoir le mal de tête de coulée entre void* et un pointeur vers une fonction membre. Je suis en train d'écrire un facile-à-utilisation de la bibliothèque pour la liaison des objets en C++ d'un interpréteur Lua, comme suit:

LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);

J'ai la plupart de le faire, sauf pour la fonction suivante (qui est spécifique à un certain signature de fonction jusqu'à ce que j'ai une chance de généraliser):

template <class T>
int call_int_function(lua_State *L) 
{
    //this next line is problematic
    void (T::*method)(int, int) = reinterpret_cast<void (T::*)(int, int)>(lua_touserdata(L, lua_upvalueindex(1)));
    T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1));

    (obj->*method)(lua_tointeger(L, 2), lua_tointeger(L, 3));
    return 0;
}

Pour ceux peu familiers avec Lua, lua_touserdata(L, lua_upvalueindex(1)) obtient la première valeur associée à un dispositif de fermeture (dans ce cas, c'est le pointeur de fonction membre) et la retourne comme une void*. GCC se plaint que void* -> void (T::*)(int, int) est pas valide en fonte. Des idées comment contourner ce problème?

parashift.com/c++-faq-lite/pointers-to-members.html
+1 ci-dessus... en particulier l'article 33.7 & 33.8
Juste par curiosité, pourquoi essayez-vous de stocker des fonctions C dans Lua userdata comme ça? il y a probablement un moyen plus sûr d'atteindre votre objectif.
Vous pouvez utiliser l'asm pour faire le travail si vous connaissez la plate-forme. C++ n'est pas salope sur elle alors. Utile dans certains cas(tels que les tests de code). Il suffit de stocker la touche func ptr dans un var, créer un void*, aller en asm et copier la valeur.

OriginalL'auteur | 2009-08-20