キャストの課題: void* をメンバー関数ポインターにキャストする
Lua 用の使いやすい C オブジェクト バインディング ライブラリを追求して、 void* とメンバー関数へのポインターの間でキャストするタスクは、大きな障害として現れます。 GCC 4.4 を利用しているときに、開発者は次のジレンマに遭遇します:
<code class="cpp">void (T::*method)(int, int) = reinterpret_cast<void (T::*)(int, int)>(lua_touserdata(L, lua_upvalueindex(1)));</code>
ここに問題の核心があります。 GCC は、その激しい苦情からも明らかなように、 void* をメンバー関数へのポインターに直接キャストしようとする試みを明確に認めていません。
解決策のロックを解除: メンバー関数ラッパーの公開
このキャストの行き詰まりを回避する鍵は、メンバーへのポインターを void* または従来のポインター型にシームレスに変換できないことを認識することにあります。メモリ位置を直接参照する一般的なポインタとは異なり、メンバーへのポインタはより複雑な詳細をカプセル化するため、別のアプローチが必要になります。
経験豊富な C プログラミング愛好家によって提案された解決策には、メンバー関数ラッパーの概念を採用することが含まれます。 。オブジェクトを最初の引数として受け取る標準関数内でメンバー関数をラップすることで、reinterpret_cast を使用して void* を目的の関数ポインターに変換できるようになります。
コード リファクタリングの例
この手法の威力を説明するために、前述の関数の次の改訂版を考えてみましょう:
<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>
この修正されたアプローチを採用することで、void* 間のキャストの問題を効果的に回避します。およびメンバー関数へのポインターを使用することで、キャストの落とし穴に遭遇することなく、シームレスな Lua オブジェクト バインディングの利点を享受できるようになります。
以上がC で void* をメンバー関数ポインターにキャストするという課題を克服するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。