Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man in C zwischen einem void*-Zeiger und einem Zeiger auf eine Mitgliedsfunktion umwandeln?

Wie kann man in C zwischen einem void*-Zeiger und einem Zeiger auf eine Mitgliedsfunktion umwandeln?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-27 20:48:30194Durchsuche

How to Cast Between a void* Pointer and a Pointer to a Member Function in C  ?

Umwandlung zwischen void* und einem Zeiger auf eine Mitgliedsfunktion

Bei der Arbeit mit C/C-Interoperabilität kann es beim Versuch einer Umwandlung zu Schwierigkeiten kommen zwischen einem void-Zeiger und einem Zeiger auf eine Mitgliedsfunktion. Dieses Problem tritt häufig beim Umgang mit Abschlüssen in Sprachen wie Lua auf, in denen Benutzerdaten als Void-Zeiger gespeichert werden.

Problem:

Umwandeln von void* in einen Zeiger auf a Die Memberfunktion in C ist aufgrund der grundlegenden Unterschiede in ihren Speicherdarstellungen ungültig. Zeiger auf Mitglieder enthalten zusätzliche Informationen, auf die über reguläre Zeiger nicht zugegriffen werden kann.

Lösung:

Um dieses Problem zu umgehen, ziehen Sie die folgenden Optionen in Betracht:

1. Wickeln Sie die Mitgliedsfunktion in eine freie Funktion ein:

  • Erstellen Sie eine freie Funktion, die die Objektinstanz als erstes Argument und die Parameter der Mitgliedsfunktion als nachfolgende Argumente akzeptiert.
  • Zurück die Adresse dieser kostenlosen Funktion anstelle des Zeigers auf das Mitglied.

Code-Snippet:

<code class="cpp">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>

2. Verwenden Sie ein Funktionsobjekt:

  • Verwenden Sie eine Technik ähnlich dem mem_fun von Boost.Bind, um ein Funktionsobjekt zu erstellen, das die Mitgliedsfunktion umschließt.
  • Vorlagen Sie das Funktionsobjekt so, dass es verschiedene unterstützt Objekttypen.

Weitere Überlegungen:

  • Stellen Sie die Kontrolle über die von lua_touserdata zurückgegebenen Benutzerdaten sicher, da diese keinen gültigen Zeiger auf ein Mitglied enthalten können .
  • Erwägen Sie, die Mitgliedsfunktion in eine Klassenmethode oder eine statische Funktion einzuschließen, wenn Sie einen zusätzlichen Status benötigen.

Das obige ist der detaillierte Inhalt vonWie kann man in C zwischen einem void*-Zeiger und einem Zeiger auf eine Mitgliedsfunktion umwandeln?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn