一部のシナリオでは、標準を想定するメソッドに Boost::function を渡すことが必要になる場合があります。関数ポインター (同じ署名を示します)。これにより、コンパイル エラーが発生する可能性があります。
typedef void TriggerProc_type(Variable*, void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)>& triggerProc ... InitVariable(triggerProc); // Error: cannot convert parameter 1
Boost::function を削除してバインドされたファンクターを参照すると、すぐに同様のエラーが発生します。 :
error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
一般に受け入れられている解決策は、些細な場合にのみ正常に機能するため、制限されています。より効果的なアプローチには、コールバック署名に従い、呼び出す適切な Boost::function を確認して実行する 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);
このメソッドは、Boost::function と Boost::function との互換性を保証します。 Boost::bind により、C コールバックとのシームレスな統合が可能になります。ただし、コールバック署名にユーザー データ ポインターが欠落している場合、このアプローチは実行できなくなります。それにもかかわらず、このようなコールバック構造は実際のアプリケーションでは本質的に制限されており、改訂が必要です。
以上が関数ポインターを必要とするメソッドに Boost::function を渡す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。