Bei der Arbeit mit C-Bibliotheken stoßen Entwickler häufig auf Herausforderungen beim Umwandeln zwischen void* und einem Zeiger auf eine Mitgliedsfunktion . Ziel dieses Artikels ist es, ein spezifisches Problem im Zusammenhang mit diesem Thema anzugehen und eine praktikable Lösung bereitzustellen.
In einem Versuch, die Bindung von C-Objekten an einen Lua-Interpreter zu erleichtern, wurde eine Funktion, call_int_function wurde mit GCC 4.4 entwickelt. Allerdings löste die Zeile reinterpret_cast
GCC betrachtet die Umwandlung von void in void (T::)(int, int) als ungültig, da es sich um Zeiger auf Mitglieder handelt unterscheiden sich von regulären Zeigern. Es handelt sich nicht um Adressen im herkömmlichen Sinne, und ihre Implementierung unterscheidet sich erheblich von Compiler zu Compiler.
Die Lösung für dieses Problem besteht darin, die Mitgliedsfunktion in eine reguläre Funktion einzubinden. Die freie Funktion sollte das Objekt als erstes Argument verwenden. Dieser Ansatz macht eine Umwandlung in void* überflüssig und ermöglicht die Verwendung eines regulären Zeigers auf den Funktionstyp.
Hier ist eine neu geschriebene Version der call_int_function unter Verwendung der vorgeschlagenen Lösung:
<code class="cpp">template <class T> int call_int_function(lua_State *L) { void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1))); T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1)); method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3)); return 0; }</code>
Durch das Einschließen der Mitgliedsfunktion in eine reguläre Funktion entfällt die Notwendigkeit einer Umwandlung in void*, wodurch der in GCC 4.4 aufgetretene Kompilierungsfehler behoben wird. Dieser Ansatz behält die beabsichtigte Funktionalität bei und beachtet gleichzeitig die Einschränkungen und Anforderungen des Pointer-to-Member-Castings.
Das obige ist der detaillierte Inhalt vonWie kann man in C zwischen void* und einem Zeiger auf eine Memberfunktion umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!