仿函數 VS 函數指針實現回調

前提:

????????本博客對比?函數指針實現回調 和??仿函數 ,突出仿函數的優勢。

目的:

????????一個類要能夠靈活的調用兩個函數,essfc?和?greaterfc,分別用于比較兩個整數的大小:

①:lessfc:判斷?x?是否小于?y,如果是則返回?true,否則返回?false

②:greaterfc:判斷?x?是否大于?y,如果是則返回?true,否則返回?false

一:函數指針實現回調

①:普通代碼:

//lessfc函數 x<y?
bool lessfc(int x, int y)
{return x < y;
}//greaterfc函數 x>y?
bool greaterfc(int x, int y)
{return x > y;
}// A這個類體現了--->函數指針實現回調
class A
{
public:A(bool(*pf)(int, int))//構造函數接收一個函數指針 并賦值給成員變量:_pf(pf){}void func(int xx, int yy)//func函數接收兩個參數{cout << "void func(int xx, int yy)" << _pf(xx, yy) << endl;;}   //用接收到的函數指針結合兩個int參數調用該函數 bool(*_pf)(int, int);//成員變量也是一個函數指針類型
};int main()
{A aa1(lessfc);//創建一個對象aa1.func(1, 2);//調用對象的func函數 且傳兩個intA aa2(greaterfc);//創建一個對象aa2.func(1, 2);//調用對象的func函數 且傳兩個int
}

運行結果:

解釋:

類?A?的行為可以通過傳入不同的函數指針來動態改變:

????????傳入?lessfc?時,func?方法會執行小于比較。

????????傳入?greaterfc?時,func?方法會執行大于比較。

②:加上模版的代碼:

//lessfc函數 x<y?
template<class T>
bool lessfc(T x, T y)
{return x < y;
}//greaterfc函數 x>y?
template<class T>
bool greaterfc(T x, T y)
{return x > y;
}// A這個類體現了--->函數指針實現回調
template<class T>
class A
{
public:A(bool(*pf)(T, T))//構造函數接收一個函數指針 并賦值給成員變量:_pf(pf){}void func(T xx, T yy)//func函數接收兩個參數{cout << "void func(T xx, T yy)" << _pf(xx, yy) << endl;;}   //用接收到的函數指針結合兩個int參數調用該函數 bool(*_pf)(T, T);//成員變量也是一個函數指針類型
};int main()
{A<int> aa1(lessfc);//因為有模版,所以顯式傳模版的類型去創建一個對象aa1.func(1, 2);//調用對象的func函數 且傳兩個int 與創建時T的類型吻合A<double>aa2(greaterfc);//因為有模版,所以顯式傳模版的類型創建一個對象aa2.func(1.1, 1.0);//調用對象的func函數 且傳兩個double 與創建時T的類型吻合
}

解釋:加上模版之后,范圍更廣了

二:仿函數

定義:一個對象能像函數一樣用,實際上調用的是我們重載的?operator()

①:普通代碼:

//定義仿函數
class lessfc //將之前的lessfc函數封裝成一個類
{
public://類中僅需對()這個操作符進行重載bool operator()(const int& x, const int& y){return x < y;}
};//定義仿函數
class greaterfc //將greaterfc函數封裝成一個類
{
public://類中僅需對()這個操作符進行重載bool operator()(const int& x, const int& y){return x > y;}
};template<class Comapre>
class A//A這個類要使用仿函數
{
public:void func(int xx, int yy){Comapre com;//創建一個 Comapre 類型的對象 com。cout << "void func(int xx, int yy)" << com(xx, yy) << endl;;//調用 com(xx, yy),即調用仿函數的 operator(),比較 xx 和 yy。}
};int main()
{A<less<int>> aa1;aa1.func(1, 2); // 輸出 1 < 2 的結果(true)A<greater<int>> aa2;aa2.func(1, 2); // 輸出 1 > 2 的結果(false)
}

運行結果:

①:不再像函數指針那樣,赤裸裸的寫兩個函數,而是在兩個類中對()運算符進行重載,重載的定義在寫函數的功能

②:需要用仿函數的類的模版參數,就是那兩個仿函數的類名,在類中進行仿函數類的對象的創建,再結合類中函數(如func)的參數,最后結合()進行函數的調用,仿函數對象看見()就會實現重載后的功能

③:main函數中的less<int>,就是對仿函數進行顯式的調用,此時的模版不再是簡單的類型,而是一個類

②:加上模版的代碼:

//定義仿函數
template<class T>
class lessfc //將之前的lessfc函數封裝成一個類
{
public://類中僅需對()這個操作符進行重載bool operator()(const T& x, const T& y){return x < y;}
};//定義仿函數
template<class T>
class greaterfc //將greaterfc函數封裝成一個類
{
public://類中僅需對()這個操作符進行重載bool operator()(const T& x, const T& y){return x > y;}
};template<class Comapre, class T>
class A//A這個類要使用仿函數
{
public:void func(T xx, T yy){Comapre com;//創建一個 Comapre 類型的對象 com。cout << "void func(T xx, T yy)" << com(xx, yy) << endl;;//調用 com(xx, yy),即調用仿函數的 operator(),比較 xx 和 yy。}
};int main()
{A<less<int>, int> aa1;aa1.func(1, 2); // 輸出 1 < 2 的結果(true)A<greater<double>, double> aa2;aa2.func(1.1, 1.0); // 輸出 1.1 >1.0 的結果(ture)
}

運算結果:

解釋:對三個類都加上模版之后,范圍更廣了

三:仿函數更優的點

1. 更靈活的功能擴展

仿函數:仿函數是一個類對象,可以包含成員變量和成員函數,因此可以在調用時保存狀態(例如計數器、配置參數等)。

函數指針:函數指針只能指向一個靜態函數,無法保存狀態,功能擴展性較差。

2. 更高的性能

仿函數:仿函數通常是內聯的(inline),編譯器可以優化其調用,減少函數調用的開銷。

函數指針:函數指針的調用需要通過指針間接調用,無法內聯,性能稍差。

3. 更強的類型安全

仿函數:仿函數是類對象,類型信息在編譯時確定,類型安全性更高。

函數指針:函數指針的類型信息較弱,容易出錯(例如指向錯誤類型的函數)。


4. 更好的通用性

仿函數:仿函數可以與模板結合,實現高度通用的代碼。例如,STL 中的排序算法 std::sort 可以通過傳入不同的仿函數實現升序或降序排序。

函數指針:函數指針的通用性較差,難以與模板結合。

5. 支持運算符重載
仿函數:仿函數可以重載 operator(),使得對象可以像函數一樣被調用,語法更直觀。

函數指針:函數指針的調用語法較為繁瑣。

6. 更易于組合和擴展
仿函數:仿函數可以通過繼承、組合等方式擴展功能。

函數指針:函數指針的功能擴展性較差,難以實現復雜的邏輯組合。


?

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

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

相關文章

CH32V208藍牙內部帶運放32位RISC-V工業級微控制器

開發板 CH32V208CBU6立創格式的開發板上述鏈接可下載&#xff0c;官方文件進行了轉換&#xff0c;使用前請仔細核對。 CH32V208CBU6原理圖&#xff0c;上述圖片為芯片部分。已進行DRC。 CH32V208CBU6 PCB三維圖&#xff0c;上述圖片為芯片部分。已進行DRC。 概述 CH32V208C…

整理和總結微信小程序的高頻知識點

前言 近期萌生了一些想法&#xff0c;感覺可以做一個小程序作為產出。 但小程序做得比較少&#xff0c;因此邊做邊復習。整理和總結了一些高頻知識點和大家一起分享。 一、模板和組件 1.1模板&#xff08;Template&#xff09; 優勢 簡單靈活&#xff1a;模板定義和使用都較…

1996-2023年各省公路里程數據(無缺失)

1996-2023年各省公路里程數據&#xff08;無缺失&#xff09; 1、時間&#xff1a;1996-2023年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;公路里程&#xff08;萬公里&#xff09; 4、范圍&#xff1a;31省 5、指標解釋&#xff1a;公路里程指報告期末…

SEARCH-R1:大型語言模型的多輪搜索推理革命

當AI學會"邊搜索邊思考" 2025年&#xff0c;語言模型領域迎來重大突破——SEARCH-R1框架通過強化學習&#xff08;RL&#xff09;讓大模型實現"動態搜索自主推理"的協同進化。這項技術不僅讓模型在回答"泰坦尼克號沉沒時的船長是誰"時能自動檢索…

Wi-Fi NAN 架構(Wi-Fi Aware Specification v4.0,第2章:2.7~2.9)

1. NAN 介質訪問控制層&#xff08;MAC&#xff09; NAN MAC負責通過參與 NAN同步信標幀&#xff08;NAN Synchronization Beacon frame&#xff09;的傳輸&#xff0c;獲取并維護設備所在的NAN集群的同步。作為同步功能的一部分&#xff0c;NAN MAC運行 TSF 定時器。NAN MAC還…

基于物聯網的便攜式土壤綜合參數檢測儀設計

標題:基于物聯網的便攜式土壤綜合參數檢測儀設計 內容:1.摘要 隨著農業現代化和環境監測需求的不斷增長&#xff0c;對土壤綜合參數的實時、準確檢測變得至關重要。本研究旨在設計一種基于物聯網的便攜式土壤綜合參數檢測儀&#xff0c;以滿足現場快速檢測和數據遠程傳輸的需求…

《Android 13深度定制:手勢攔截技術實現SystemUI狀態欄智能折疊方案》

核心機制解析 在Android 13的SystemUI定制中&#xff0c;狀態欄下拉行為由NotificationPanelViewController控制&#xff0c;其核心邏輯聚焦于手勢事件處理和布局動態調整。當用戶執行下拉操作時&#xff0c;系統通過onQsIntercept方法攔截滑動事件&#xff0c;并調用setQsExp…

《Python實戰進階》No26: CI/CD 流水線:GitHub Actions 與 Jenkins 集成

No26: CI/CD 流水線&#xff1a;GitHub Actions 與 Jenkins 集成 摘要 持續集成&#xff08;CI&#xff09;和持續部署&#xff08;CD&#xff09;是現代軟件開發中不可或缺的實踐&#xff0c;能夠顯著提升開發效率、減少錯誤并加速交付流程。本文將探討如何利用 GitHub Actio…

2025.3.22總結

今天去了光谷書店&#xff0c;看了下&#xff0c;書店里女生比較多&#xff0c;也不知道是不是上班族&#xff0c;發現有本類似馬克思的書籍&#xff0c;也不知道是不是再考研或者考其他證書的。 圖書館很安靜&#xff0c;安靜的讓我的內心也平靜了下來&#xff0c;我也再一旁…

HR人員和組織信息同步AD域服務器實戰方法JAVA

HR人員和組織信息同步AD域服務器 前期準備AD域基礎知識整理HR同步AD的邏輯代碼結構配置文件設置啟動類HR組織的BeanHR人員Bean獲取HR人員和組織信息的類AD中處理組織和人員的類日志配置 POM.xml文件生成EXE文件服務器定時任務異常問題注意事項 前期準備 1、開發語言&#xff1…

修改服務器windows遠程桌面默認端口號

修改服務器windows遠程桌面默認端口號 在Windows服務器上修改遠程桌面協議&#xff08;RDP&#xff09;的默認端口&#xff08;3389&#xff09;可以增強服務器的安全性&#xff0c;減少被惡意掃描和攻擊的風險。以下是修改遠程端口的詳細步驟&#xff1a; 按 Win R 打開運行…

MuJoCo 仿真 Panda 機械臂!末端位置實時追蹤 + 可視化(含縮放交互)

視頻講解&#xff1a; MuJoCo 仿真 Panda 機械臂&#xff01;末端位置實時追蹤 可視化&#xff08;含縮放交互&#xff09; 倉庫地址&#xff1a;GitHub - LitchiCheng/mujoco-learning 本期介紹下&#xff0c;mujoco_py這個庫很老了&#xff0c;最新的版本可以通過mujoco的p…

vue-splice方法

一、代碼解析 語法結構 splice(index, deleteCount, newElement) 是 JavaScript 數組的變異方法&#xff0c;其參數含義為&#xff1a; ? index&#xff1a;操作的起始位置&#xff08;索引&#xff09;。 ? 1&#xff1a;刪除的元素數量&#xff08;此處刪除 1 個元素&#…

在Mac M1/M2芯片上完美安裝DeepCTR庫:避坑指南與實戰驗證

讓推薦算法在Apple Silicon上全速運行 概述 作為推薦系統領域的最經常用的明星庫&#xff0c;DeepCTR集成了CTR預估、多任務學習等前沿模型實現。但在Apple Silicon架構的Mac設備上&#xff0c;安裝過程常因ARM架構適配、依賴庫版本沖突等問題受阻。本文通過20次環境搭建實測…

spring boot 攔截器

1、創建ServletConfig配置類 package com.pn.config;import com.pn.filter.LoginFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.web.servlet.Fil…

論文閱讀筆記:Denoising Diffusion Probabilistic Models (2)

接論文閱讀筆記&#xff1a;Denoising Diffusion Probabilistic Models (1) 3、論文推理過程 擴散模型的流程如下圖所示&#xff0c;可以看出 q ( x 0 , 1 , 2 ? , T ? 1 , T ) q(x^{0,1,2\cdots ,T-1, T}) q(x0,1,2?,T?1,T)為正向加噪音過程&#xff0c; p ( x 0 , 1 , …

【大模型基礎_毛玉仁】3.5 Prompt相關應用

目錄 3.5 相關應用3.5.1 基于大語言模型的Agent3.5.2 數據合成3.5.3 Text-to-SQL3.5.4 GPTs 3.5 相關應用 Prompt工程應用廣泛&#xff0c;能提升大語言模型處理基礎及復雜任務的能力&#xff0c;在構建Agent、數據合成、Text-to-SQL轉換和設計個性化GPTs等方面不可或缺。 . …

Deepseek訓練成AI圖片生成機器人

目錄 內容安全層 語義理解層 提示詞工程層 圖像生成層 交付系統 訓練好的指令(復制就可以) 內容安全層 理論支撐:基于深度語義理解的混合過濾系統 敏感詞檢測:采用BERT+CRF混合模型,建立三級敏感詞庫(顯性/隱性/文化禁忌),通過注意力機制捕捉上下文關聯風險 倫…

深入理解 Linux ALSA 音頻架構:從入門到驅動開發

文章目錄 一、什么是 ALSA?二、ALSA 系統架構全景圖核心組件詳解:三、用戶空間開發實戰1. PCM 音頻流操作流程2. 高級配置(asound.conf)四、內核驅動開發指南1. 驅動初始化模板2. DMA 緩沖區管理五、高級主題1. 插件系統原理2. 調試技巧3. 實時音頻優化六、現代 ALSA 發展七…

探秘海螺 AI 視頻與計算機視覺算法的奇妙融合

目錄 開篇&#xff1a;數字浪潮下的視頻新變革 藍耘 Maas 平臺與海螺 AI 視頻&#xff1a;嶄露頭角的視頻創作利器 圖片生成視頻&#xff1a;化靜為動的魔法 文本生成視頻&#xff1a;文字到畫面的奇妙轉換 注冊與登錄 計算機視覺算法&#xff1a;海螺 AI 視頻的核心驅動力…