ホームページ  >  記事  >  バックエンド開発  >  C で void* ポインターとメンバー関数へのポインターの間でキャストする方法

C で void* ポインターとメンバー関数へのポインターの間でキャストする方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-27 20:48:30194ブラウズ

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

void* とメンバー関数へのポインター間のキャスト

C/C 相互運用性を使用する場合、キャストしようとすると問題が発生する可能性があります。 void ポインターとメンバー関数へのポインターの間。この問題は、ユーザー データが void ポインターとして保存される Lua などの言語でクロージャーを扱うときによく発生します。

問題:

void* をポインターへのポインターにキャストするC のメンバー関数は、メモリ表現の根本的な違いにより無効です。メンバーへのポインターには、通常のポインターではアクセスできない追加情報が含まれています。

解決策:

これを回避するには、次のオプションを検討してください:

1.メンバー関数をフリー関数でラップします:

  • オブジェクト インスタンスを最初の引数として受け入れ、メンバー関数パラメーターを後続の引数として受け入れるフリー関数を作成します。
  • Returnメンバーへのポインターの代わりに、この無料関数のアドレス。

コード スニペット:

<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.関数オブジェクトを使用します:

  • Boost.Bind の mem_fun と同様の手法を利用して、メンバー関数をラップする関数オブジェクトを作成します。
  • さまざまな機能をサポートする関数オブジェクトをテンプレート化します。オブジェクト タイプ。

その他の考慮事項:

  • 有効なメンバーへのポインタを含めることができないため、lua_touserdata によって返されるユーザー データを確実に制御します。 .
  • 追加の状態が必要な場合は、メンバー関数をクラス メソッドまたは静的関数でラップすることを検討してください。

以上がC で void* ポインターとメンバー関数へのポインターの間でキャストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。