Boost庫中boost::function函數使用詳解

1. 函數作用

boost::function 是 Boost 庫提供的一個 通用函數封裝器,可用于存儲、傳遞和調用任意可調用對象(如普通函數、函數指針、Lambda、函數對象、成員函數指針等)。它類似于 C++11 及以上標準的 std::function

作用總結:

  • 可以存儲不同類型的可調用對象。
  • 可以實現回調機制。
  • 提供類型安全的函數調用接口。
  • 允許運行時動態綁定函數。

2. 函數原型

boost::function 是模板類,其基本形式為:

template<typename Signature>
class boost::function;

其中 Signature 是函數簽名,形式為:

RetType(ArgTypes...)

例子:

boost::function<int(int, int)> func;

表示 func 可以存儲任何返回 int,參數為兩個 int 的函數。


3. 參數說明

  • Signature:函數簽名,指定返回類型和參數類型。

  • 賦值對象

    • 普通函數指針
    • 函數對象(重載 operator() 的類)
    • Lambda 表達式
    • 成員函數指針(需要綁定實例或使用 boost::bind

4. 使用步驟

  1. 包含頭文件
#include <boost/function.hpp>
#include <boost/bind/bind.hpp>  // 如果需要綁定成員函數
  1. 聲明函數對象
boost::function<返回類型(參數類型...)> func;
  1. 賦值可調用對象
func = 普通函數指針;
func = lambda表達式;
func = 函數對象;
func = boost::bind(&::成員函數, 對象, _1, _2);
  1. 調用函數
func(arg1, arg2);

5. 代碼示例

示例 1:普通函數

#include <iostream>
#include <boost/function.hpp>int add(int a, int b) {return a + b;
}int main() {boost::function<int(int, int)> func = add;std::cout << "3 + 5 = " << func(3, 5) << std::endl;return 0;
}

示例 2:Lambda 表達式

boost::function<int(int,int)> func = [](int a, int b){ return a*b; };
std::cout << "3*5 = " << func(3,5) << std::endl;

示例 3:函數對象

struct Multiply {int operator()(int a, int b) {return a * b;}
};boost::function<int(int,int)> func = Multiply();
std::cout << func(4,5) << std::endl;

示例 4:成員函數

struct MyClass {int add(int a, int b) { return a + b; }
};MyClass obj;
boost::function<int(int,int)> func = boost::bind(&MyClass::add, &obj, _1, _2);
std::cout << func(10, 20) << std::endl;

6. 關鍵注意事項

  1. 類型匹配嚴格

    • boost::function 的函數簽名必須與被賦值對象完全匹配。
  2. 可為空

    • 默認構造的 boost::function 對象為空,可通過 func.empty() 檢查。
    • 調用空函數對象會拋出異常 boost::bad_function_call
  3. 性能開銷

    • boost::function 支持類型擦除,因此存在一定的運行時開銷。
  4. 拷貝與賦值

    • 支持拷貝構造和賦值操作,但內部實現是深拷貝。

7. 高級用法

  1. 結合 boost::bind 綁定參數
boost::function<int(int)> func = boost::bind(add, 5, _1);
std::cout << func(10); // 輸出 15
  1. 存儲不同類型的函數
boost::function<void()> f;
f = [](){ std::cout << "Lambda\n"; };
f();
f = [](){ std::cout << "Another Lambda\n"; };
f();
  1. 回調機制
void process(boost::function<void(int)> callback) {for(int i=0;i<3;i++)callback(i);
}process([](int n){ std::cout << n << "\n"; });
  1. 與多態結合
  • 可以存儲不同類成員函數,但簽名相同。
  • 可實現策略模式或事件驅動系統。

總結:
boost::function 是一種 類型安全、可存儲任意可調用對象的函數封裝器,常用于回調、事件系統和動態綁定場景。在 C++11 及以上,std::function 提供了完全相同的功能,但 boost::function 在老項目或對 Boost 特性依賴時仍然非常實用。


8. 實際應用場景實例

下面是一些boost::function 的實際應用場景實例**,覆蓋回調、事件系統、策略模式、多態調用等,既有基礎也有高級用法。


1. GUI 或事件回調

在事件驅動程序中,boost::function 可以存儲回調函數:

#include <iostream>
#include <boost/function.hpp>
#include <vector>class Button {
public:boost::function<void()> onClick;void click() {if(onClick) onClick();  // 調用回調}
};int main() {Button btn;btn.onClick = [](){ std::cout << "Button clicked!\n"; };btn.click(); // 輸出: Button clicked!// 可以動態修改回調btn.onClick = [](){ std::cout << "Another action!\n"; };btn.click(); // 輸出: Another action!
}

應用場景:GUI、事件驅動系統、信號槽機制。


2. 數學計算策略模式

可以動態替換算法,實現策略模式:

#include <iostream>
#include <boost/function.hpp>double add(double a, double b) { return a + b; }
double multiply(double a, double b) { return a * b; }int main() {boost::function<double(double,double)> strategy;strategy = add;std::cout << "Add: " << strategy(3,5) << std::endl;  // 8strategy = multiply;std::cout << "Multiply: " << strategy(3,5) << std::endl;  // 15
}

應用場景:動態選擇算法或處理策略,如金融計算、圖像處理算法選擇。


3. 成員函數綁定

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind/bind.hpp>struct Printer {void printNumber(int n) { std::cout << "Number: " << n << std::endl; }
};int main() {Printer p;boost::function<void(int)> func = boost::bind(&Printer::printNumber, &p, _1);func(42); // 輸出: Number: 42
}

應用場景:將類成員方法作為回調或任務傳遞,常見于任務調度、異步操作。


4. 異步任務調度

結合任務隊列或線程池使用:

#include <iostream>
#include <boost/function.hpp>
#include <vector>
#include <thread>void asyncTask(boost::function<void()> task) {std::thread t([task](){ task(); });t.detach();
}int main() {boost::function<void()> task = [](){ std::cout << "Task executed asynchronously\n"; };asyncTask(task);std::this_thread::sleep_for(std::chrono::seconds(1)); // 等待任務執行
}

應用場景:線程池、異步任務、事件回調系統。


5. 參數綁定與偏函數

利用 boost::bind 綁定部分參數:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind/bind.hpp>int compute(int a, int b, int c) {return a + b * c;
}int main() {boost::function<int(int,int)> func = boost::bind(compute, 2, _1, _2);std::cout << func(3,4) << std::endl;  // 輸出: 2 + 3*4 = 14
}

應用場景:任務預配置、偏函數應用、參數固定化。


6. 多態回調

存儲不同類對象的成員函數,只要簽名一致:

#include <iostream>
#include <boost/function.hpp>
#include <boost/bind/bind.hpp>struct A {void say() { std::cout << "Hello from A\n"; }
};struct B {void say() { std::cout << "Hello from B\n"; }
};int main() {boost::function<void()> func;A a; B b;func = boost::bind(&A::say, &a); func(); // 輸出: Hello from Afunc = boost::bind(&B::say, &b); func(); // 輸出: Hello from B
}

應用場景:動態選擇對象方法、插件系統、策略切換。


7. 數值計算回調

用于迭代、求根或積分函數傳入回調:

#include <iostream>
#include <boost/function.hpp>
#include <cmath>double integrate(boost::function<double(double)> f, double a, double b, int n) {double step = (b-a)/n;double sum = 0;for(int i=0;i<n;i++)sum += f(a + i*step) * step;return sum;
}int main() {auto f = [](double x){ return std::sin(x); };std::cout << "Integral of sin(x) from 0 to pi: " << integrate(f, 0, 3.1415926, 1000) << std::endl;
}

應用場景:數值計算、優化算法、回調式計算。


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

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

相關文章

SQL Server安全刪除數據并釋放空間的技術方案

在SQL Server中執行大規模數據刪除時&#xff0c;直接使用DELETE語句可能導致日志文件暴漲、事務阻塞和性能下降。以下提供一種安全刪除數據并釋放磁盤空間的完整方案&#xff1a; 方案核心步驟 -- 設置讀未提交隔離級別&#xff08;避免鎖競爭&#xff09; SET TRAN ISOLATION…

EgoVLA——根據第一視角的人類視頻中訓練的VLA模型:助力家具組裝等人形靈巧操作任務的攻克(利用可穿戴手部追蹤)

前言 我在此文《ForceVLA——將具備力感知的MoE整合進π0的動作專家中&#xff1a;從而融合“視覺 語言 力反饋”三者實現精密插拔》的開頭說過&#xff0c;我司「七月在線」目前側重以下兩大本體的場景落地 人形層面&#xff0c;側重 1.1 人形靈巧操作 1.2 人形展廳講解機械…

廚具新風尚,解鎖廚房新體驗

在快節奏的現代生活中&#xff0c;廚房已不僅僅是烹飪的場所&#xff0c;更是家庭溫馨與創意的源泉。一款好的廚具&#xff0c;不僅能讓烹飪變得輕松愉悅&#xff0c;更能為餐桌增添無限風味。今天&#xff0c;就讓我們一起走進廚具的新世界&#xff0c;解鎖那些令人愛不釋手的…

手機長焦進化史:攀過十年,終抵云巔

今天&#xff0c;華為相機解決方案專家熊諶飛在《長焦十年之路對談》直播中&#xff0c;首次系統揭秘了華為手機長焦技術的十年進化史。從P9雙攝到Pura 80系列“一鏡雙目”&#xff0c;每一代影像旗艦&#xff0c;都有一段鮮為人知的誕生秘辛。不少觀眾這才恍然大悟&#xff1a…

鈣鈦礦光伏:十年磨一劍,產業化突圍路在何方?

2013年&#xff0c;一種具有高效太陽能轉化率、高電荷傳輸率、低成本、制作簡單等優點的新型太陽能電池材料——鈣鈦礦突然出現在大眾視野。相比于又重又硬、轉換效率通常只有22&#xff05;-26&#xff05;的傳統晶體硅太陽能板&#xff0c;鈣鈦礦太陽能電池薄如蟬翼可彎曲&am…

斷言:assert()的實用指南

目錄 一、斷言概述 二、基本用法 三、工作原理 四、斷言的優點 五、啟用和禁用斷言 六、性能考慮 七、最佳實踐 八、示例代碼 一、斷言概述 assert.h 頭文件定義了宏 assert()&#xff0c;用于在運行時驗證程序是否符合指定條件。如果條件不滿足&#xff0c;程序會報錯并…

開發避坑指南(27):Vue3中高效安全修改列表元素屬性的方法

需求 Vue3 中如何遍歷list并修改list元素的屬性的值&#xff1f; 解決辦法 1、?使用 map 方法? const newList list.value.map(item > {return {...item,modifiedProperty: newValue // 修改的屬性名稱和屬性值} })Vue 中的 map() 函數是 JavaScript 數組的高階函數&…

L4 級別自動駕駛 硬件架構設計

L4 級自動駕駛&#xff08;根據 SAE 標準&#xff0c;屬于 “高度自動化”&#xff09;的核心是系統在特定場景下&#xff08;如城市道路、高速路&#xff09;可完全自主完成駕駛任務&#xff0c;無需駕駛員干預&#xff0c;且在系統失效時能自動實現安全降級。其硬件架構需滿足…

【網絡安全測試】手機APP安全測試工具NowSecure 使用指導手冊(有關必回)

以下是 NowSecure安全測試工具 的詳細使用指導&#xff0c;涵蓋從環境準備、測試配置到報告分析的完整流程&#xff0c;適合團隊協作或合規性審計場景&#xff1a; NowSecure 使用指導手冊 1. 工具簡介 定位&#xff1a;自動化移動應用&#xff08;Android/iOS&#xff09;安全…

Matlab(5)進階繪圖

一、Advanced 2D plots1. Logarithm Plotsx logspace(-1,1,1000); % 從-1到1生成等間隔的1000個點 y x .^ 2; subplot(2,2,1); plot(x,y); title(Plot); subplot(2,2,2); semilogx(x,y); title(Semilogx); subplot(2,2,3); semilogy(x,y); title(Semilogy); subplot(2,2,4);…

運維學習Day22——Anisible自動化與基本使用

文章目錄01-Ansible 自動化介紹Ansible 自動化介紹手動執行任務和自動化執行任務基礎架構即代碼Ansible 與 DevOps什么是 ANSIBLE&#xff1f;Ansible 特點Ansible 概念和架構Ansible WayAnsible 用例Ansible 部署準備實驗環境控制節點受管節點LinuxWindows網絡設備02-Ansible …

Codeforces Deque工藝

題目來源&#xff1a; 問題 - 2128B - Codeforces 這道題有些地方表達的并不是特別準確&#xff0c;首先就是從最左端與最右端移除一個元素&#xff0c;實際含義是從原數組的最左端或者最右段依次取出一個元素構成一個新的數組&#xff0c;使得這個新數組的數組符合題目的“好…

談談《More Effective C++》的條款30:代理類

在《More Effective C》的條款30中&#xff0c;Scott Meyers深入探討了**代理類&#xff08;Proxy Classes&#xff09;**的設計與應用。代理類是一種通過重載運算符模擬原始對象行為的設計模式&#xff0c;其核心目標是在不直接暴露原始對象的情況下&#xff0c;提供額外功能、…

實用AI在線開發工具網址匯總(含免費限額,國內可訪)

AI在線開發工具 標題分類屬性在線開發工具1https://www.builder.io/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具2https://replit.com/介紹詳見&#xff1a;AI在線編碼三劍客對決&#xff1a;Replit/Builder/Blot在線開發工具3https…

react+vite來優化下每次使用hook函數都要引入的情況

前言&#xff1a;react項目中&#xff0c;每個頁面都得引入react/react-dom等元素&#xff0c;就像uniapp的項目中得onload,onshow等生命周期一樣&#xff0c;這里也可以用vite的插件&#xff1a;unplugin-auto-import 來解決我們每次都需要調用才能使用hook方法的問題。安裝&a…

【排序算法】⑤冒泡排序

系列文章目錄 第一篇&#xff1a;【排序算法】①直接插入排序-CSDN博客 第二篇&#xff1a;【排序算法】②希爾排序-CSDN博客 第三篇&#xff1a;【排序算法】③直接選擇排序-CSDN博客 第四篇&#xff1a;【排序算法】④堆排序-CSDN博客 第五篇&#xff1a;【排序算法】⑤冒…

如何使用gpt進行模式微調(2)?

對 GPT&#xff08;Generative Pre-trained Transformer&#xff09;類大模型進行微調&#xff08;Fine-tuning&#xff09;&#xff0c;是將其適配到特定任務或領域的關鍵步驟。以下是 ??全流程指南??&#xff0c;涵蓋方法選擇、數據準備、訓練配置、評估部署等核心環節&a…

基于飛算JavaAI實現圖書管理系統框架部署

摘要 本文詳細介紹了如何利用飛算JavaAI技術實現圖書管理系統的框架部署。首先闡述了飛算JavaAI的基本概念、特點和優勢&#xff0c;接著對圖書管理系統的需求進行分析&#xff0c;然后按照軟件開發流程&#xff0c;從系統設計、代碼生成、框架搭建到部署測試&#xff0c;逐步展…

ODE-by-Matlab-01-人口增長模型

博客地址&#xff1a;Matlab微分方程01-模型 馬爾薩斯模型 馬爾薩斯模型是人口增長模型中最簡單的模型&#xff0c;它由英國牧師家馬爾薩斯在1798年提出。 他利用在教堂工作的機會&#xff0c;收集英國100多年的人口數據&#xff0c;發現人口的相對增長率是常數。 在這個基礎…

云原生環境 Prometheus 企業級監控實戰

目錄 一&#xff1a;基于 kubernetes 的 Prometheus 介紹 1&#xff1a;環境簡介 2&#xff1a;監控流程 3&#xff1a;Kubernetes 監控指標 二&#xff1a;Prometheus 的安裝 1&#xff1a;從 Github 克隆項目分支 2&#xff1a;安裝 Prometheus Operator --server-si…