ホームページ > バックエンド開発 > C++ > 関数ポインターを必要とするメソッドに Boost::function を渡す方法は?

関数ポインターを必要とするメソッドに Boost::function を渡す方法は?

Mary-Kate Olsen
リリース: 2024-11-14 16:44:02
オリジナル
475 人が閲覧しました

How to Pass a Boost::function to a Method Expecting a Function Pointer?

Boost::function からプレーン関数ポインターを導出する

一部のシナリオでは、標準を想定するメソッドに 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 の回避

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート