Casting zwischen void * und einen Zeiger auf member-Funktion

Ich bin derzeit mit GCC 4.4, und ich bin mir ziemlich Kopfschmerzen casting zwischen void* und einen Zeiger auf member-Funktion. Ich bin versucht zu schreiben, eine einfach zu bedienende Bibliothek für das binden von C++ - Objekten zu einem Lua-interpreter, etwa so:

LuaObject<Foo> lobj = registerObject(L, "foo", fooObject);
lobj.addField(L, "bar", &Foo::bar);

Ich habe die meisten es getan, mit Ausnahme der folgenden Funktion (die ist auf eine bestimmte Funktion Unterschrift, bis ich eine chance habe, zu verallgemeinern):

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;
}

Für diejenigen von Ihnen nicht vertraut mit Lua lua_touserdata(L, lua_upvalueindex(1)) bekommt den ersten Wert zugeordnet ist, einen Verschluss (in diesem Fall, es ist der Zeiger auf member-Funktion) und gibt es als void*. GCC beschwert sich, dass void* -> void (T::*)(int, int) ist ein Ungültiger Stimmen. Irgendwelche Ideen auf, wie man das umgehen kann?

parashift.com/c++-faq-lite/pointers-to-members.html
+1 die oben... insbesondere Abschnitt 33.7 & 33.8
Nur aus Neugier, warum sind Sie versuchen zu speichern C-Funktionen in Lua userdata? wahrscheinlich gibt es ein sicherer Weg, um Ihr Ziel zu erreichen.
Sie können asm, um den job tun, wenn Sie wissen, die Plattform. C++ nicht meckern es dann. In einigen Fällen sinnvoll(z.B. testen von code). Einfach speichern Sie die func ptr in eine var, erstellen Sie eine void*, gehen in asm und kopieren Sie den Wert über.

InformationsquelleAutor | 2009-08-20

Schreibe einen Kommentar