Je suis actuellement en train d'utiliser GCC 4.4, et j'ai beaucoup de casse-tête entre void * et un pointeur vers la fonction membre. Je suis en train d'écrire une bibliothèque facile à utiliser pour la liaison des objets C++ à un interprète Lua, comme ceci:Coulée entre void * et un pointeur vers la fonction membre
LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
J'ai la plus grande partie fait, à l'exception de la fonction suivante (qui est spécifique à une certaine signature de la fonction jusqu'à ce que j'ai une chance de le 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 qui ne connaissent pas Lua, lua_touserdata(L, lua_upvalueindex(1))
obtient la première valeur associée à une fermeture (dans ce cas, il est le pointeur de fonction membre) et le retourne comme vide *
. GCC se plaint que void *
-> void (T :: *) (int, int) est une distribution invalide. Des idées sur la façon de contourner cela?
http://www.parashift.com/c++-faq-lite/pointers-to-members .html –
+1 ci-dessus ... spécifiquement section 33.7 & 33.8 – fbrereto
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. – Alex