Boost::function をプレーン関数ポインターに降格する
問題:
boost::function を必要とするメソッドへの同じシグネチャを持つプレーンな関数ポインタとして使用すると、C2664 などのエラーが発生する可能性があります。
解決策:
答えは、boost::function からポインタを取得するために target() を使用することを提案しています。これは、最初にバインドされたオブジェクトが C コールバックへのバインドに適格であったという自明な場合にのみ機能します。
自明でない場合、 boost::function の基礎となるメカニズムには、1 つだけではなく複数のポインターが必要です。したがって、より堅牢な解決策は、コールバック署名に準拠し、ユーザー データとして保存されている boost::function への呼び出しを委任する shim 関数を作成することです。
例:
// Shim function for callback typedef void (*CallbackType)(int x, void* user_data); void MyCallback(int x, void* userData) { boost::function<void(int)>& pfn = static_cast<boost::function<void(int)> &>(userData); pfn(x); } // Usage boost::function<void(int)> fn = boost::bind(myFunction(5)); RegisterCallback(MyCallback, &fn);
このアプローチにより、ユーザー データを含む C コールバックで boost::function を使用できるようになります。ただし、コールバック署名にユーザー データ ポインターが欠落している場合、ほとんどの状況で使用できるようにするには完全な再設計が必要になる可能性があります。
以上が「boost::function」をプレーン関数ポインターに安全に渡すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。