void* とメンバー関数へのポインター間のキャスト
C/C 相互運用性を使用する場合、キャストしようとすると問題が発生する可能性があります。 void ポインターとメンバー関数へのポインターの間。この問題は、ユーザー データが void ポインターとして保存される Lua などの言語でクロージャーを扱うときによく発生します。
問題:
void* をポインターへのポインターにキャストするC のメンバー関数は、メモリ表現の根本的な違いにより無効です。メンバーへのポインターには、通常のポインターではアクセスできない追加情報が含まれています。
解決策:
これを回避するには、次のオプションを検討してください:
1.メンバー関数をフリー関数でラップします:
コード スニペット:
<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.関数オブジェクトを使用します:
その他の考慮事項:
以上がC で void* ポインターとメンバー関数へのポインターの間でキャストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。