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

Mary-Kate Olsen
リリース: 2024-10-29 07:18:02
オリジナル
1035 人が閲覧しました

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

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

C ライブラリを使用する場合、開発者は void* とメンバー関数へのポインターの間のキャストで課題に遭遇することがよくあります。 。この記事は、このトピックに関連する特定の問題に対処し、実行可能な解決策を提供することを目的としています。

問題ステートメント

Lua インタープリタ、関数への C オブジェクトのバインドを容易にする試みで、 call_int_function は、GCC 4.4 を使用して設計されました。ただし、行 reinterpret_cast)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))) は、void からポインターへの無効なキャストを示すコンパイル エラーを発生させました。

エラーの原因

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート