【C++】回調函數和回調對象

文章目錄

    • 回調
    • 可調用對象
    • 函數指針作回調
    • 函數對象作回調
      • 函數對象的使用
      • std::function【C++11】
      • 作回調使用
    • 【C++11】Lambda表達式作回調
    • 【C++11】bind對象作回調
      • std::bind的使用
      • 作回調使用

回調

  • 當發生某種事件時需要調用或觸發另一個事件即為回調,回調的核心即為將可調用對象作為參數傳遞,在滿足某種條件時執行。

可調用對象

  • 可調用對象包括函數、函數指針、函數對象/仿函數【C++】、Lambda表達式【C++11】、bind對象【C++11】

函數指針作回調

  • int (*Callback)(int,int);函數指針Callback指向一個返回值為int類型,傳參為兩個int類型的函數,例如int add(int x,int y);

// 定義回調函數類型(函數指針)
typedef int (*Callback)(int,int);// 回調事件(接受回調)
void Event(Callback cb,int x,int y) {std::cout<<cb(x,y)<<std::endl; // 觸發回調
}// 實際回調
int My_Callback(int x,int y) {return x+y+100;
}int main() {int x{0};int y{0};cin>>x>>y;Event(My_Callback,x,y); // 注冊回調return 0;
}

函數對象作回調

函數對象的使用

  • 函數對象即仿函數,實際上是類中對于()運算符進行重載operator(),本質是對象調用其成員函數(成員方法)。
class MyPrint {
public:
//重載()運算符void operator()(string text) {cout << text << endl;}
};
class MyAdd {
public:int operator()(int a, int b) {return a + b;}
};
int main() {MyPrint my;my("你好");//my.operator()("你好");//函數對象即仿函數實質是對函數運算符()的重載MyAdd add;cout<<add(5, 5)<<endl;return 0;
}

std::function【C++11】

  • C++11引入的通用可調用對象包裝器它可以存儲、復制和調用任何可調用對象,作用其實類似于函數指針,只不過函數指針只適用于函數,而std::function適用于所有的可調用對象。
  • std::function<返回值類型(參數類型1, 參數類型2, …)>
//示例-存儲普通函數
#include <iostream>
#include <functional>int add(int a, int b) {return a + b;
}int main() {std::function<int(int, int)> func = add;  // 存儲函數指針std::cout << func(2, 3);  // 輸出 5return 0;
}

作回調使用

  • 函數對象作回調是整個對象被傳遞,而不僅僅是函數,可以攜帶自己的屬性
#include<iostream>
#include<functional>
using namespace std;typedef std::function<int(int,int)> callback;// 實際回調
class My_Callback{public:int operator()(int x,int y){return x+y+other;}int other{100};//函數對象可以保存自己的屬性
};// 回調事件(接受回調)
void Event(callback cb,int x,int y) {std::cout<<cb(x,y)<<std::endl; // 觸發回調
}int main() {int x{0};int y{0};cin>>x>>y;My_Callback Callback;Event(Callback,x,y); // 注冊回調return 0;
}

【C++11】Lambda表達式作回調

  • Lambda表達式實際上可以看作一段可調用的函數代碼,具體使用方法可見文章C++11 Lambda表達式以及 C++11新特性 第9點,在此不再贅述。
//Lambda表達式作回調
#include<iostream>
#include<functional>
using namespace std;typedef std::function<int(int,int)> callback;// 回調事件(接受回調)
void Event(callback cb,int x,int y) {std::cout<<cb(x,y)<<std::endl; // 觸發回調
}int main() {int x{0};int y{0};cin>>x>>y;// 實際回調函數(Lambda)auto Callback = [](int x,int y){return x+y+100;};Event(Callback,x,y); // 注冊回調return 0;
}

【C++11】bind對象作回調

std::bind的使用

  • std::bind用于將函數和參數綁定成一個可調用對象,可以和std::function配合使用,綁定后的結果可以使用std::function存儲
//std::bind的使用#include<iostream>
#include<functional>
using namespace std;int My_Callback(int x,int y) {return x+y+100;
}int main() {int x{0};int y{0};cin>>x>>y;auto Callback= std::bind(&My_Callback,x,y);std::cout<<Callback()<<std::endl;return 0;
}

作回調使用

#include<iostream>
#include <functional>
using namespace std;class My_Callback{public:int add(int x,int y){return x+y+other;}int other{100};//函數對象可以保存自己的屬性
};int main() {int x{0};int y{0};cin>>x>>y;My_Callback Callback;//需要調用成員方法add,所以必須傳this(即Callback)std::function<int(int,int)> callback = std::bind(&My_Callback::add,&Callback,std::placeholders::_1, std::placeholders::_2); //std::placeholders::_1, std::placeholders::_2即為占位符,表示有兩個參數//等價于 std::function<int(int,int)> callback=[&Callback](int x,int y){return Callback.add(x,y);};std::cout<<callback(x,y)<<std::endl; /*也可直接綁定參數即:std::function<int()> callback = std::bind(&My_Callback::add,&Callback,x,y);//等價于 std::function<int()> callback=[&Callback,x,y](){return Callback.add(x,y);};std::cout<<callback()<<std::endl; */return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/73442.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73442.shtml
英文地址,請注明出處:http://en.pswp.cn/web/73442.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DeepSeek助力文案,智能音箱如何改變你的生活?

你好&#xff0c;我是三橋君 你有沒有為寫智能音箱的宣傳文案而抓耳撓腮過&#xff1f;三橋君在這方面可是有些感想&#xff0c;今天就來給你嘮嘮怎么用DeepSeek寫出超贊的智能音箱宣傳文案。 首先&#xff0c;你得給DeepSeek喂足“料”。這就好比做飯&#xff0c;你得準備好各…

【區塊鏈安全 | 第一篇】密碼學原理

文章目錄 1.哈希函數1.1 哈希函數的性質1.2 常見哈希算法1.3 Merkle Tree&#xff08;默克爾樹&#xff09;1.4 HMAC&#xff08;哈希消息認證碼&#xff09; 2. 公鑰密碼學2.1 對稱加密 vs 非對稱加密2.2 RSA 算法2.3 ECC&#xff08;橢圓曲線密碼學&#xff09;2.4 Diffie-He…

基于websocketpp實現的五子棋項目

該博客對于學完C和linux操作系統&#xff0c;但不知道如何用C開發項目&#xff0c;已經不知道C如何使用第三方庫的人來說一定很有幫助&#xff0c;請耐心看完&#xff01; 先看一下游戲會顯示的前端界面&#xff0c;對理解這個游戲的前后端交互過程會有幫助 1. 開發環境 1.1 …

基于Redis分布鎖+事務補償解決數據不一致性問題

基于Redis的分布式設備庫存服務設計與實現 概述 本文介紹一個基于Redis實現的分布式設備庫存服務方案&#xff0c;通過分布式鎖、重試機制和事務補償等關鍵技術&#xff0c;保證在并發場景下庫存操作的原子性和一致性。該方案適用于物聯網設備管理、分布式資源調度等場景。 …

RK3568筆記八十: Linux 小智AI環境搭建

若該文為原創文章&#xff0c;轉載請注明原文出處。 最近小智AI火了&#xff0c;韋老師出了 Linux 小智 AI 聊天機器人 版本&#xff0c;想移植到 RK3568上&#xff0c; 由于和韋老師硬件不同&#xff0c;所以需要交叉編譯一些庫&#xff0c;為后續移植做準備。 一、環境 1、…

C# SerialPort 使用詳解

總目錄 前言 在工業控制、物聯網、嵌入式開發等領域&#xff0c;串口通信&#xff08;Serial Port Communication&#xff09;是連接串行設備&#xff08;如條碼掃描器、GPS接收器等&#xff09;與計算機的重要手段。C# 提供了內置的 SerialPort 類&#xff0c;簡化了串口開發…

3D點云的深度學習網絡分類(按照作用分類)

1. 3D目標檢測&#xff08;Object Detection&#xff09; 用于在點云中識別和定位目標&#xff0c;輸出3D邊界框&#xff08;Bounding Box&#xff09;。 &#x1f539; 方法類別&#xff1a; 單階段&#xff08;Single-stage&#xff09;&#xff1a;直接預測3D目標位置&am…

LabVIEW 與 PLC 通訊的常見方式

在工業自動化和數據采集系統中&#xff0c;PLC&#xff08;可編程邏輯控制器&#xff09; 廣泛用于控制和監測各種設備&#xff0c;而 LabVIEW 作為強大的圖形化編程工具&#xff0c;常用于上位機數據處理和可視化。為了實現 LabVIEW 與 PLC 的高效通訊&#xff0c;常見的方法包…

2025 polarctf春季個人挑戰賽web方向wp

來個彈窗 先用最基礎的xss彈窗試一下 <script>alert("xss")</script>沒有內容&#xff0c;猜測過濾了script&#xff0c;雙寫繞過一下 <scrscriptipt>alert("xss")</scscriptript>background 查看網頁源代碼 查看一下js文件 類…

【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細)

在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。【Ai】--- 可視化 DeepSeek-r1 接入 Open WebUI(超詳細) 開發環境一、前情提要:你…

7.1-7.2考研408數據結構查找算法核心知識點深度解析

考研408數據結構查找算法核心知識點深度解析 一、查找基本概念 1.1 核心定義與易錯點 查找表與關鍵字 易錯點:混淆靜態查找表(僅查詢)與動態查找表(含插入/刪除操作)的應用場景。例如哈希表屬于動態查找結構,而分塊查找適用于靜態數據。難點:理解平均查找長度(ASL)的…

Redis--redis客戶端

目錄 一、引言 二、數據庫管理命令 三、redis客戶端 四、Java客戶端使用Redis 五、相關命令使用 1.get&#xff0c;set 2.exists&#xff0c;del 3.keys 4.expire&#xff0c;ttl 六、總結 一、引言 在之前學了redis相關類型命令之后&#xff0c;本篇文章&#xff0c;…

SpringBoot3.0不建議使用spring.factories,使用AutoConfiguration.imports新的自動配置方案

文章目錄 一、寫在前面二、使用imports文件1、使用2、示例比對3、完整示例 參考資料 一、寫在前面 spring.factories是一個位于META-INF/目錄下的配置文件&#xff0c;它基于Java的SPI(Service Provider Interface)機制的變種實現。 這個文件的主要功能是允許開發者聲明接口的…

鴻蒙特效教程10-卡片展開/收起效果

鴻蒙特效教程10-卡片展開/收起效果 在移動應用開發中&#xff0c;卡片是一種常見且實用的UI元素&#xff0c;能夠將信息以緊湊且易于理解的方式呈現給用戶。 本教程將詳細講解如何在HarmonyOS中實現卡片的展開/收起效果&#xff0c;通過這個實例&#xff0c;你將掌握ArkUI中狀…

hn航空app hnairSign unidbg 整合Springboot

聲明: 本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包內容、敏感網址、數據接口等均已做脫敏處理&#xff0c;嚴禁用于商業用途和非法用途&#xff0c;否則由此產生的一切后果均與作者無關&#xff01; 逆向分析 學習unidbg補環境。先弄一個…

奇怪的異形選項卡樣式、弧形邊框選項卡

<template><div :class"$options.name"><div class"tab">默認選項卡</div><div class"tab" active>選中選項卡</div><el-divider /><el-tabs v-model"tabActiveName" tab-click"(t…

特殊行車記錄儀DAT視頻丟失的恢復方法

行車記錄儀是一種常見的車載記錄儀&#xff0c;和常見的“小巧玲瓏”的行車記錄儀不同&#xff0c;一些特種車輛使用的記錄儀的外觀可以用“笨重”來形容。下邊我們來看看特種車載行車記錄儀刪除文件后的恢復方法。 故障存儲: 120GB存儲設備/文件系統:exFAT /簇大小:128KB 故…

UE5小石子陰影在非常近距離才顯示的問題

Unreal中采用LandscapeGrass生成的地形&#xff0c;在MovieRenderQueue中渲染時陰影顯示距離有問題&#xff0c;在很近的時候才會有影子&#xff0c;怎么解決&#xff1f; 地面上通過grass生成的小石子的陰影只能在很近的時候才能顯示出來&#xff0c;需要如下調整 r.Shadow.R…

零基礎上手Python數據分析 (9):DataFrame 數據讀取與寫入 - 讓數據自由穿梭

回顧一下,上篇博客我們學習了 Pandas 的核心數據結構 Series 和 DataFrame。 DataFrame 作為 Pandas 的 “王牌” 數據結構,是進行數據分析的基石。 但 DataFrame 的強大功能,還需要建立在 數據輸入 (Input) 和 數據輸出 (Output) 的基礎上。 數據從哪里來? 分析結果又如何…

【商城實戰(65)】退換貨流程全解析:從前端到后端的技術實現

【商城實戰】專欄重磅來襲!這是一份專為開發者與電商從業者打造的超詳細指南。從項目基礎搭建,運用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用戶、商品、訂單等核心模塊開發,再到性能優化、安全加固、多端適配,乃至運營推廣策略,102 章內容層層遞進。無論是想…