Actualmente estoy usando GCC 4.4, y estoy teniendo bastante dolor de cabeza entre void * y un puntero a la función miembro. Estoy intentando escribir una biblioteca fácil de usar para los objetos C++ unión a un intérprete de Lua, así:Casting entre void * y un puntero a la función de miembro
LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
Tengo la mayor parte de que se haga, a excepción de la siguiente función (que es específica a una cierta firma de función hasta que tenga la oportunidad de generalizar):
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 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 un vacío *
. GCC se queja de que void *
-> void (T :: *) (int, int) es un molde inválido. ¿Alguna idea sobre cómo solucionar esto?
http://www.parashift.com/c++-faq-lite/pointers-to-members .html –
+1 la anterior ... específicamente la sección 33.7 & 33.8 – fbrereto
Solo por curiosidad, ¿por qué intentas almacenar funciones C en los datos de usuario de Lua así? Probablemente haya una forma más segura de lograr su objetivo. – Alex