Boost::function をプレーン関数ポインターに降格する
Boost::function は関数ポインターを管理するための多用途ツールですが、プレーンな関数ポインターを期待する C コールバックで使用するのは困難です。この記事では、この問題の複雑さを調査し、shim 関数を使用した堅牢な解決策を提供します。
この問題は、バインドされた boost::function を、同じシグネチャを持つプレーンな関数ポインターを期待するメソッドに直接渡そうとしたときに発生します。 。これにより、関数ポインター表現の違いによりコンパイラ エラーが発生します。
受け入れられた回答では、boost::function::target() を使用して基になる関数ポインターを取得することを提案していますが、このアプローチには制限があります。これは、boost::function が C コールバックにバインドできる関数ポインターを使用して構築されているという簡単な場合にのみ機能します。
この問題に対処するには、より信頼性の高いアプローチは、次の条件を満たす shim 関数を作成することです。コールバック署名を取得し、適切な boost::function への呼び出しをディスパッチします。これは、boost::function ポインタをユーザー データとしてコールバック関数に保存することで実現できます。
このアプローチの使用方法の例を次に示します。
typedef void (*CallbackType)(int x, void* user_data); void RegisterCallback(CallbackType cb, void* user_data); void MyCallback(int x, void* userData) { boost::function<void(int)> pfn = static_cast<boost::function<void(int)>>(userData); pfn(x); } boost::function<void(int)> fn = boost::bind(myFunction(5)); RegisterCallback(MyCallback, &fn);
このソリューションは以下を提供します。コールバック署名にユーザー データ ポインターが含まれていない場合でも、C コールバックで boost::function と boost::bind を使用するクリーンで信頼性の高い方法です。
以上が単純な関数ポインターを期待する C コールバックに `boost::function` を渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。