ホームページ > バックエンド開発 > C++ > 単純な関数ポインターを期待する C コールバックに `boost::function` を渡すにはどうすればよいですか?

単純な関数ポインターを期待する C コールバックに `boost::function` を渡すにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-09 14:38:02
オリジナル
775 人が閲覧しました

How to Pass a `boost::function` to a C Callback Expecting a Plain Function Pointer?

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

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