私は現在GCC4.4を使用してvoid*
いますが、メンバー関数へのポインターとの間でかなりの頭痛の種があります。次のように、C++オブジェクトを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)
が無効なキャストであると文句を言います。これを回避する方法について何かアイデアはありますか?