boost::function をプレーン関数ポインターに降格する
boost::function を扱うときに直面する一般的な課題の 1 つは、それをプレーンな関数ポインタに変換します。これは、使用可能な関数が boost::function にカプセル化されているときに、特定のシグネチャを持つ関数ポインターを期待するコードと対話するときに発生します。
問題
次の点を考慮してください。コード:
typedef void TriggerProc_type(Variable*,void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)> triggerProc ... InitVariable(triggerProc);
このコードをコンパイルすると次のようになります。エラー:
error C2664: 'InitVariable' : cannot convert parameter 1 from 'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
解決策
この問題に対する推奨される解決策は、予期されるコールバック署名に準拠する shim 関数を作成することです:
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);
この例では、MyCallback が shim 関数として機能し、boost::function を互換性のあるコールバックに変換します。ユーザー データ パラメーターは boost::function オブジェクトを保存するために利用され、MyCallback が単純なキャストを使用してそのオブジェクトにアクセスして実行できるようにします。
ダイレクト バインディングが常に実現できるわけではない理由
バインドされたファンクターの直接バインディングはオプションですが、常に適切であるとは限らないことに注意することが重要です。重要な boost::function< >通常、オブジェクトには複数のポインタが必要なため、C スタイルのコールバックへの直接変換が困難になります。
結論
MyCallback のような shim 関数を使用すると、効果的にブリッジすることが可能になります。 boost::function と C スタイルのコールバックの間のギャップ。このアプローチにより、シームレスな統合が可能になり、プレーンな関数ポインターが必要なシナリオで boost::function を利用できるようになります。
以上がboost::function をプレーン関数ポインタに変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。