異なるクラスで一貫して機能する一般的なイベント処理メカニズムを作成することを目的とした元の質問。静的メソッドに依存してクラスインスタンスポインターを渡す代わりに、STD :: functionおよびstd :: bindを使用して、より最新のCアプローチを使用できます。関数オブジェクトは、通常の関数ポインターのように渡すことができる呼び出し可能なエンティティを表します。イベントハンドラーメソッドのaddhandlerはstd :: function を結合するために、特定のクラスメソッドをイベントハンドラーにバインドします。STD:: BINDが使用されます。 std :: bindイベントがトリガーされたときにこのポインターと呼び出される関数を指定します。
{
公共:
myclass();
//注:「static」とマークされなくなり、実際の引数のみを取るだけです
void callback(int x);
プライベート:
int private_x;
};
myclass :: myclass()
{
名前空間STD ::プレースホルダーを使用します。 // `_1`の場合
private_x = 5;
ハンドラー - > addhandler(std :: bind(&myclass :: callback、this、_1));
}
void myclass :: callback(int x)
{
//明示的な「インスタンス」引数はもう必要ありません。
//「This」が適切にセットアップされます
cout 匿名のコールバックの場合、lambda関数はイベントハンドラーで使用できます。さまざまなクラスや関数に適用できるコールバック用の柔軟な一般的なソリューション。特定の関数
class EventHandler
{
public:
void addHandler(std::function
コールバックがクラスのコンテキストのない自立型関数の場合、std :: bindは不要です。
{
// ...
}
int main()
{
// ...
ハンドラー - > addhandler(freestindingcallback);
}
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3