В настоящее время я использую GCC 4.4, и у меня есть отличная головная боль между void * и указателем на функцию-член. Я пытаюсь написать простую в использовании библиотеку для связывания объектов С++ с интерпретатором Lua, например:
LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);
У меня есть большая часть этого, за исключением следующей функции (которая специфична для определенной сигнатуры функции, пока у меня не будет возможности ее обобщить):
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;
}
Для тех из вас, кто не знаком с Lua, lua_touserdata(L, lua_upvalueindex(1))
получает первое значение, связанное с замыканием (в этом случае оно является указателем на функцию-член) и возвращает его как void *
. GCC жалуется, что void *
→ void (T:: *) (int, int) является недопустимым. Любые идеи о том, как обойти это?