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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-29 07:18:021036ブラウズ

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

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