包装器 std::function
使用前,包头文件:
#include <functional>
std::function 是 C++标准库 中的一个通用函数包装器;
它可以储存、复制、调用任何可调用的对象,包括:函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。
1. function 的模板原型
#include <functional>function<Ret(Args...)>
// Ret 是被调用函数的返回值类型
// Args... 是被调用函数的形参
举一个函数指针的例子讲解:
int fun(int a, int b) {return a + b;
}int main() {function<int(int, int)> func1 = fun; // 此处的 fun 本质是 fun() 的函数指针,与 &fun 无差别// <int(, )> : int 为被调用函数的返回值类型// (int, int) : 为被调用函数的形参return 0;
}
2. function 的几种使用方法
2.1 函数指针
上面的例子已经展示过了。
2.2 成员函数
class Plus
{
public:static int Plusi(int a, int b) // 静态成员函数{return a + b;}double Plusd(double a, double b) // 非静态成员函数{return a + b;}
};int main()
{function<int(int, int)> func2 = &Plus::Plusi;cout << func2(1, 1) << endl;// 非静态成员函数,第一个参数为隐藏的 this 指针function<double(Plus, double, double)> func3 = &Plus::Plusd; cout << func3(Plus(), 1.1, 2.2) << endl;return 0;
}
2.3 lambda 表达式
int main()
{function<int(int, int)> func4 = [](int a, int b) { return a + b; };return 0;
}
2.4 仿函数
struct Fun {int operator()(int a, int b) {return a + b;}
};int main()
{function<int(int, int)> func5 = Fun();return 0;
}
3. 包装器解决模板效率低下的问题
将下面的代码运行起来,观察 useF() 模板被实例化成了几份?
template<class F, class T>
auto useF(F f, T x) // 实际场景中不建议用 auto 推导返回值类型
{static int count = 0;cout << "count: " << ++count << endl;cout << "count: " << &count << endl;return f(x);
}double f(double x)
{return x / 2;
}struct Fun
{double operator()(double x){return x / 3;}
};int main()
{auto f1 = [](double x) { return x / 4; };cout << useF(f1, 11.11) << endl;cout << useF(f, 11.11) << endl;cout << useF(Fun(), 11.11) << endl;return 0;
}

从运行结果中可以看出, count 始终为 1 且每一个 count 的地址都不相同。事实上,useF() 被实例化成了三份。
我们可以利用包装器解决模板效率低下的问题。
function<double(double)> func1 = f1;cout << useF(func1, 11.11) << endl << endl;function<double(double)> func2 = f;cout << useF(func2, 11.11) << endl << endl;function<double(double)> func3 = Fun();cout << useF(func2, 11.11) << endl << endl;

为什么通过
std::function包装后,useF() 只会实例化出一份呢?不妨通过
typeid观察 func1、func2、func3 的类型。
相关文章:
包装器 std::function
使用前,包头文件:#include <functional> std::function 是 C标准库 中的一个通用函数包装器; 它可以储存、复制、调用任何可调用的对象,包括:函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。 1…...
Java | Leetcode Java题解之第219题存在重复元素II
题目: 题解: class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {Set<Integer> set new HashSet<Integer>();int length nums.length;for (int i 0; i < length; i) {if (i > k) {set.remove(nums[i - …...
800 元打造家庭版 SOC 安全运营中心
今天,我们开始一系列新的文章,将从独特而全面的角度探索网络安全世界,结合安全双方:红队和蓝队。 这种方法通常称为“紫队”,集成了进攻和防御技术,以提供对威胁和安全解决方案的全面了解。 在本系列的第一篇文章中,我们将指导您完成以 100 欧元约800元左右的预算创建…...
vite项目使用qiankun构建hash路由微前端
文章目录 前言一、主应用使用react18 react-router-dom61、项目安装2、主应用中注册微应用3、主应用中设置路由和挂载子应用的组件 二、创建react18 react-router-dom6子应用1、项目安装2、修改子应用 vite.config.ts3、修改子应用 main.tsx,区分qiankun环境和独立部署环境4、…...
通过rpmbuild构建Elasticsearch-7.14.2-search-guard的RPM包
系列文章目录 rpmbuild从入门到放弃 search-guard插件使用入门手册 文章目录 系列文章目录前言一、资源准备二、spec文件1.基础信息2.%prep3.%Install4.%file5.%post6.%postun 三、成果演示1.执行构建过程图示例2.执行安装RPM包示例3.进程检查4.访问esApi 总结 前言 不管是源…...
js 图片放大镜
写购物项目的时候,需要放大图片,这里用js写了一个方法,鼠标悬浮的时候放大当前图片 这个是class写法 <!--* Descripttion: * Author: 苍狼一啸八荒惊* LastEditTime: 2024-07-10 09:41:34* LastEditors: 夜空苍狼啸 --><!DOCTYPE …...
数据模型-ER图在数据模型设计中的应用
ER图在数据模型设计中的应用 1. ER图概述:起源与发展 实体-关系图(Entity Relationship Diagram,简称ER图)起源于1970年代,由Peter Chen首次提出,作为描述数据和信息间关系的图形化语言。随着数据库技术…...
C++ //练习 14.46 你认为应该为Sales_data类定义上面两种类型转换运算符吗?应该把它们声明成explicit的吗?为什么?
C Primer(第5版) 练习 14.46 练习 14.46 你认为应该为Sales_data类定义上面两种类型转换运算符吗?应该把它们声明成explicit的吗?为什么? 环境:Linux Ubuntu(云服务器) 工具&…...
tensorflow张量生成以及常用函数
张量tensor:多维数组(列表) 阶:张量的维数 维数 阶 名字 例子 0-D 0 标量 scalar s 1, 2, 3 1-D 1 向量 vector…...
如何在 Windows 10 上恢复未保存的 Word 文档
您是否整晚都在处理一个重要的 word 文件,但忘记保存它了?本文适合您。在这里,我们将解释如何恢复未保存的 word 文档。除此之外,您还将学习如何恢复已删除的 word 文档。 从专业人士到高中生,每个人都了解丢失重要 W…...
Rust入门实战 编写Minecraft启动器#3解析资源配置
首发于Enaium的个人博客 在上一篇文章中,我们已经建立了资源模型,接下来我们需要解析游戏的配置文件。 首先我们添加serde_json依赖和model依赖。 model { path "../model" } serde_json "1.0"之后我们在lib.rs中添加解析的tra…...
openFileInput 内部保持的数据如何删除
在Android中,openFileInput 是用于从设备内部存储中读取文件的API,但它本身并不提供直接删除文件的功能。要删除通过 openFileInput 读取的文件,你需要使用其他方法。以下是如何删除内部存储中文件的步骤和说明: 步骤 获取文件路…...
Python编写的俄罗斯方块小游戏
文章目录 游戏页面实现代码 游戏页面 左右键移动方块位置,上键切换方块形态。 实现代码 import pygame import random# 初始化 Pygame pygame.init()# 定义颜色 colors [(0, 0, 0), # 黑色(255, 0, 0), # 红色(0, 255, 0), # 绿色(0, 0, 255), # 蓝色(255,…...
前端直连小票打印机,前端静默打印,js静默打印解决方案
最近公司开发了一个vue3收银系统,需要使用小票打印机打印小票,但是又不想结账的时候弹出打印预览,找了很多方案,解决不了js打印弹出的打印预览窗口! 没办法,自己写了一个winform版本的静默打印软件…...
python批量读取Excel数据写入word
from docx import Document from docx.shared import Pt from docx.enum.table import WD_TABLE_ALIGNMENT, WD_ROW_HEIGHT_RULE import os import pandas as pd from docx import Document from docx.oxml.ns import qn from docx.shared import Pt # ... 其他代码 ... work…...
Unity 常用取整方法
向下取整:Mathf.FloorToInt() 向上取整:Math.Ceiling 截断取整:(int) 四舍五入:Mathf.RoundToInt e.NewValues.value.ToString(“F0”) 百分比: int i 400; int j 200; string p ((double)i…...
Apache Seata Mac下的Seata Demo环境搭建
本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 本文来自 Apache Seata官方文档,欢迎访问官网,查看更多深度文章。 Mac下的Seata Demo环境搭建(AT模式) 前言 最近因为工作需要…...
记录|C#安装+HslCommunication安装
记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022,跳转下…...
Android 12系统源码_设备设置(一)Settings介绍
前言 Settings 类是一个用于访问和管理设备设置的关键类,而作为系统开发人员,经常需要用这个类来做一些系统设备设置,而Settings里面存在着好几个处理不同领域的设备设置类,那么如何才能结合自己的业务场景正确选择使用这些设备设…...
如何查看GD32 Keil和IAR工程的map文件
我们在设计调试程序时,往往需要知道一个函数或一个变量它在MCU中具体所在的地址以及所占用的空间大小,这时候就需要查看map文件。 那么什么是map文件呢?map文件是编译器编译工程后生成的一个文件,文件会有很多信息,比…...
算法将驱动一切:边缘AI智能体如何重塑智能系统
仓库装卸区的安全摄像头每天采集86400秒的视频数据。长途卡车上的车队远程信息记录仪在两次加油之间积累了数GB的行车影像。外科手术机器人的立体摄像头以每秒60帧的速度生成密集点云。所有这些数据都产生于数字世界与现实世界的交界处,但几乎没有任何一条被用于智能…...
学术合规性危机预警:Perplexity生成内容如何精准适配Chicago第17版?,一文锁定98.7%高校期刊投稿要求
更多请点击: https://intelliparadigm.com 第一章:学术合规性危机预警:Perplexity生成内容如何精准适配Chicago第17版? 随着AI辅助写作工具在人文社科领域的深度渗透,Perplexity等生成式平台输出的引文、脚注与参考文…...
从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束
从原理图到Vivado:手把手教你搞定XC7Z020-CLG400的EMIO引脚分配与约束 在ZYNQ7000系列开发中,EMIO引脚的正确分配与约束是实现PS与PL协同工作的关键环节。许多工程师在初次接触ZYNQ架构时,往往会被MIO、EMIO和AXI_GPIO的关系所困扰ÿ…...
为AI智能体构建可编程邮箱:mailbot实战指南
1. 项目概述:为AI智能体打造专属的“可编程邮箱”如果你正在开发一个AI智能体,无论是客服机器人、自动化工作流还是个人助理,让它具备收发邮件的能力往往是刚需。传统的做法是什么?要么去折腾Gmail的API,忍受OAuth授权…...
基于ConvLSTM与天气图的时空序列预测:新能源功率预测实战
1. 项目概述与核心价值最近几年,我身边不少做新能源电站运维和电力交易的朋友,都在为一个问题头疼:发电量预测不准。无论是光伏电站还是风电场,发电功率就像个“看天吃饭”的孩子,云层一遮,风速一变&#x…...
AI时代算力、模型与安全的三角博弈:从Nvidia生态到工程实践
1. 项目概述:当算力、智能与安全交织的时代最近和几个在芯片设计、大模型应用以及安全服务公司工作的朋友聊天,大家不约而同地都聊到了一个话题:我们正处在一个由Nvidia芯片驱动的AI浪潮之巅,但这场盛宴似乎并非没有天花板。一方面…...
从CANdb++到Matlab:手把手教你读懂DBC文件里的信号映射与物理值转换
从CANdb到Matlab:手把手教你读懂DBC文件里的信号映射与物理值转换 在汽车电子和嵌入式系统开发中,DBC文件作为CAN总线通信的"字典",承载着整车网络通信的核心协议。对于刚接触汽车网络通信的工程师来说,面对DBC文件中密…...
基于MCP协议与HaE工具构建AI安全情报助手实战指南
1. 项目概述:一个为安全工程师量身定制的“情报雷达”如果你是一名安全工程师、渗透测试人员或者负责企业安全运营的从业者,那么你一定对“信息收集”和“威胁情报”这两个词深有体会。每天,我们都需要从海量的数据源中——无论是公开的漏洞库…...
从锂电池热失控到锡须短路:高可靠性系统安全工程实践
1. 从“工程恐怖故事”到系统安全文化的反思最近在整理资料时,翻到一篇十多年前的旧文,标题叫《工程恐怖:机毁人亡》。文章汇集了几位航空与国防领域工程师亲历的、令人脊背发凉的真实事故案例。这些故事没有出现在主流新闻的头条,…...
R语言数据清洗避坑指南:melt()函数参数详解与常见错误排查
R语言数据清洗避坑指南:melt()函数参数详解与常见错误排查 数据清洗是数据分析过程中最关键的环节之一,而R语言中的melt()函数作为数据重塑的利器,在实际应用中却常常让用户陷入各种"坑"。本文将深入剖析melt()函数的参数设置与常见…...
