Conversión entre void * y un puntero a la función miembro
Actualmente estoy usando GCC 4.4, y tengo bastante dolor de cabeza entrevoid*
y un puntero a la función miembro. Estoy tratando de escribir una biblioteca fácil de usar para vincular objetos C ++ a un intérprete de Lua, así:
LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
Lo he hecho casi todo, excepto por la siguiente función (que es específica de cierta firma de función hasta que tengo la oportunidad de generalizarla):
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;
}
Para aquellos de ustedes que no están familiarizados con Lua,lua_touserdata(L, lua_upvalueindex(1))
obtiene el primer valor asociado con un cierre (en este caso, es el puntero a la función miembro) y lo devuelve como unvoid*
. GCC se queja de quevoid*
->void (T::*)(int, int)
es un elenco no válido. ¿Alguna idea sobre cómo solucionar esto?