C ライブラリを使用する場合、開発者は void* とメンバー関数へのポインターの間のキャストで課題に遭遇することがよくあります。 。この記事は、このトピックに関連する特定の問題に対処し、実行可能な解決策を提供することを目的としています。
Lua インタープリタ、関数への C オブジェクトのバインドを容易にする試みで、 call_int_function は、GCC 4.4 を使用して設計されました。ただし、行 reinterpret_cast
GCC は、メンバーへのポインターがあるため、void から void (T::)(int, int) へのキャストが無効であるとみなします。通常のポインタとは異なります。これらは伝統的な意味でのアドレスではなく、その実装はコンパイラによって大きく異なります。
この問題の解決策は、メンバー関数を通常の関数内にラップすることです。 free 関数は、オブジェクトを最初の引数として受け取る必要があります。このアプローチにより、void* にキャストする必要がなくなり、関数型への通常のポインターを使用できるようになります。
提案されたソリューションを使用して call_int_function を書き直したバージョンを次に示します。
<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* へのキャストの必要がなくなり、GCC 4.4 で発生したコンパイル エラーが解決されます。このアプローチでは、ポインターからメンバーへのキャストの制限と要件を遵守しながら、意図した機能が維持されます。
以上がC で void* とメンバー関数へのポインターの間でキャストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。