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…