std::functional 类是干什么用的?
author: hjjdebug
date: 2025年 04月 29日 星期二 15:54:53 CST
description: std::functional 类是干什么用的?
文章目录
- 1.functional 对象的概念
- 2.functional 对象存在的意义
- 2.1 为什么要把接口再封一层?
- 2.2 c++中函数参数可以不用回调函数, 而改用functional 对象,统一接口
- 3 补充: std::bind 的作用是什么?
尽量用直白的语言来描述问题,少用那些含混不清的貌似高大上的词汇.
1.functional 对象的概念
std::functional 是c++11引入的类, 为的是通过对象封装一个函数调用
例如. 封装一个普通函数, 封装一个匿名函数, 或者封装一个类的成员函数.
这里所谓的封装,就是包起来,由它保管.
因为在functional 成员中定义了一个函数指针,
由它保留了构建对象时传入的函数地址.
对于类函数,它还保留了由std::bind 传入的对象地址,
当你调用functional 对象时是加了(), 显然,functional类也重载了操作符(),
该操作符会调用保留的地址, 也能够为调用函数添加额外参数,如果你用std::bind绑定过.
给一个简单的例子,其使用估计也就差不多了, 调试完了就有概念了.
#include <iostream>
#include <functional> //c++11引入的概念//统一接口调用: 通过 std::function 封装不同可调用对象,
//std::function<返回类型(参数类型1,参数类型2,....)>func;using namespace std;
int foo(int x) { return x; }class MyClass {
public://类的成员函数int sum_val(int x) { sum+=x; return sum; }//类的静态函数,用static 来声明,属于类而不属于对象static int s_getval() { return s_val;}
private:int sum;
public:static int s_val;
};
MyClass obj;
int MyClass::s_val=100;int main()
{//封装一个已定义的函数//声明了一个对象,用函数地址为其赋值 , 会调用std::function的赋值构造函数std::function<int(int)> func1 = foo; cout<<"ordinary function ret:"<<func1(5)<<endl;// 封装一个匿名函数(lambda 表达式),直接定义函数体而且不用起名字.// 懒得起名字了,就用[]代替,叫无名.std::function<int(int,int)> func2 = [](int a, int b){return a+b;};cout<<"anonymous func return val:"<<func2(3,5)<<endl;//封装一个静态成员函数,就是封装一个普通函数std::function<int()> func3 = MyClass::s_getval; cout<<"class static function is as ordinary function:"<<func3()<<endl;//成员函数,需通过 std::bind 传递this 指针为第一个参数std::function<int(int)> func4 = std::bind(&MyClass::sum_val,&obj,std::placeholders::_1); //_1表示占位符,调用时传递的参数int val=func4(5);val=func4(4);cout << "class function return val:"<<val<<endl;
}
执行代码:
./function
ordinary function ret:5
anonymous func return val:8
class static function is as ordinary function:100
class function return val:9
2.functional 对象存在的意义
2.1 为什么要把接口再封一层?
问题来了, 我直接调用就可以了,为什么还要把它封装起来呢?
好处是. 接口统一. 都是创建对象func,付给其地址,调用对象,
像下面这样func(参数1,参数2,…)
对象重载了()操作符
看起来,不过就是换了个名称而已,能叫好处吗?
嗯, 在普通的函数调用中确实是多此一举. 但在回调函数中有用.
因为回调函数是做为参数传递的函数.
当你写底层代码时, 可能需要调用高层代码,但现在高层代码还没有实现,是什么样子还不清楚.
但是框架必需要确定,传递什么参数,返回什么类型. 这就是回调函数的核心思想.
2.2 c++中函数参数可以不用回调函数, 而改用functional 对象,统一接口
到了c++时代,不用调用回调函数了, 可以用functional 对象了. 你想让系统执行你的代码,
向functional对象传递地址就可以了.
底层代码编写时,虽然不知道上层回调要实现什么功能, 但functonal 对象是知道的,所以它可以完成底层的逻辑.
对底层而言,就是统一了编程接口.
再给一个实例吧. 短小精悍!, 运用了for_each语句, 匿名函数,回调函数.
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>//定义一个process 函数, 它的一个参数是 function object,
void process(int value, const std::function<void(int)>& callback) {callback(value); //我们可以直接调用这个 functional obj 对象->callback
}int main() {std::vector<int> values = {1, 2, 3, 4, 5};// 使用匿名函数作为for_each的处理函数,其中会调用process 函数//process函数的第二个参数又是一个匿名函数. 它的功能是打印变量的值std::for_each(values.begin(), values.end(), [&](int value) {process(value, [](int x) { std::cout << "Processed: " << x << std::endl; });});return 0;
}
执行结果:
./function
Processed: 1
Processed: 2
Processed: 3
Processed: 4
Processed: 5
for_each是C++标准模板库(STL)中的通用算法,定义于头文件中。
其核心功能是遍历指定迭代器范围内的元素,
并对每个元素执行用户定义的操作。该操作可以是普通函数、函数对象(仿函数)或Lambda表达式
总之, 原来是自己直接调用函数,现在是先创建对象,交给对象一些东西,让对象去调用.
基本上,还是觉得多此一举. 当然,有了这个第三者,这个第三者在安全性上会做一些工作.
不过c++擅长的也就是封装,封装,封装…其三大主流特征之首就是封装. 核心思想是交给我,我替你办! 实际是交给对象,让对象去办.@搞砸了,那是对象的事@,当然也可能是调用的事,匹配的事.
3 补充: std::bind 的作用是什么?
std::bind 是保留传来的参数到std::func 对象,将来调用func对象时, 把这个参数传递出去.
std::bind 调用成员函数, 传递this 指针,只是它的一个应用方式,它可以传递任何自定义数据.
$ cat main.cpp
#include <iostream>
#include <functional>
#include <string>void printString(const std::string& prefix, const std::string& str) {std::cout << prefix << ": " << str << std::endl;
}int main() {// 创建一个std::function对象,保留一个调用参数到func对象中, 则对象会把参数传递给函数std::function<void(std::string)> boundFunc = std::bind(printString, "Info", std::placeholders::_1);boundFunc("Hello World"); // 输出: Info: Hello Worldreturn 0;
}
执行代码:
./function
Info: Hello World
相关文章:
std::functional 类是干什么用的?
author: hjjdebug date: 2025年 04月 29日 星期二 15:54:53 CST description: std::functional 类是干什么用的? 文章目录 1.functional 对象的概念2.functional 对象存在的意义2.1 为什么要把接口再封一层?2.2 c中函数参数可以不用回调函数, 而改用func…...
人事管理系统6
模糊查询 DepartmentMapper.xml : <select id"findDepartmentListByName" resultMap"BaseResultMap"> select <include refid"Base_Column_List"/> from department where dname like %${dname}% /*where dname like con…...
链表的中间节点
这题需要用到快慢指针的思想,快指针叫fast,慢指针是slow,快指针每次往后移两个节点,slow只移动一个节点,这样子fast的速度是slow的两遍,当fast遍历完链表,slow才遍历一半,正好就在中…...
【学习学学】城市群与都市圈是什么?怎么
城市群与都市圈是什么?怎么发展 这些年城市群,都市圈的概念被逐渐提了出来,也是未来我国即将重点发展的对象之一。 因此,身边有一些朋友在问,城市群与都市圈有什么区别?哪个对城市发展影响更大?…...
【深度学习与大模型基础】第14章-分类任务与经典分类算法
Part 1:什么是分类任务? 1.1 分类就是“贴标签” 想象你有一堆水果,有苹果🍎、橘子🍊、香蕉🍌,你的任务是让机器学会自动判断一个新水果属于哪一类——这就是分类(Classification&…...
第十五章:预训练大语言模型
目录 15.1 数据准备 15.1.1 数据预处理 15.1.2 数据调度 15.2 模型架构 15.2.1 主流架构 一、编码器架构(Encoder-only,以 BERT 为代表) 核心特点: 代表模型:BERT、RoBERTa、ALBERT 典型应用: 二…...
万象生鲜配送系统代码2025年4月29日更新日志
亲爱的用户:万象生鲜配送系统始终致力于为您提供更优质、高效的服务体验。经过我们技术团队的不懈努力,万象生鲜配送系统在 2025 年 4 月迎来了一次重大更新。本次更新涵盖了多个方面,包括功能新增、性能优化以及问题修复,旨在进一…...
Mac 创建QT按钮以及一些操作
在创建QT项目好 后我们打开mainwindow.cpp,下面所示的代码都是在这个cpp文件里面因为它是窗口的入口函数 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QPushButton>//按钮的头文件MainWindow::MainWindow(QWidget *pa…...
C++学习之shell高级和正则表达式
目录 1.正则表达式 2.C中使用正则 3.复习 4.sort命令 5.uniq命令 6.wc命令 7.grep命令 8.find命令 9.xargs命令 10.sed命令 11.awk命令 12.crontab 1.正则表达式 1 管道 使用| 将多个命令拼接在一起 原理,就是将前一个命令的标准输出作为后一个…...
SpringBoot获取用户信息常见问题(密码屏蔽、驼峰命名和下划线命名的自动转换)
文章目录 一、不返回password字段二、返回的createTime和updateTime为空原因解决:开启驼峰命名和下划线命名的自动转换 一、不返回password字段 在字段上面添加JsonIgnore注解即可 JsonIgnore // 在把对象序列化成json字符串时,忽略该字段 private Str…...
优化PCB Via Stub系列(2) – 运用U-Turn Via设计破解阻抗匹配困境,改善信号完整性
在PCB设计中,往往透过制程改善如背钻、盲孔或埋孔,来消除不必要的Via stub,可是多出来的制造成本会压低产品的毛利,可是又有什么办法可以不透过制程改善以缩小Via stub带来的SI困扰呢? 本周我们来讲从Layout布局的角度…...
飞鸟游戏模拟器 1.0.3 | 完全免费无广告,内置大量经典童年游戏,重温美好回忆
飞鸟游戏模拟器是一款专为安卓用户设计的免费游戏模拟器,内置了大量经典的童年游戏。该模拟器拥有丰富的游戏资源,目前已有约20,000款游戏,包括多种类型如冒险、动作、角色扮演等。用户可以直接搜索查找想要玩的游戏进行下载并启动。游戏库中…...
钓鱼网页散播银狐木马,远控后门威胁终端安全
在当今网络环境下,许多人都有通过搜索引擎下载应用程序的习惯,虽然这种方式简单又迅速,但这也可能被不法分子所利用,通过设置钓鱼网站来欺骗用户。这些钓鱼网站可能会通过各种方式吸引用户点击,从而进行病毒的传播&…...
一文读懂 JavaScript 中的深浅拷贝
在 JavaScript 编程里,深浅拷贝是处理数据时极为关键的概念。理解它们的差异,能帮我们规避许多数据操作上的 “陷阱”。今天,咱们就借助简单的 “abc” 相关示例,深入探索深浅拷贝的奥秘,并且通过在浏览器控制台输出结…...
5G技术在工业4.0中的应用:连接未来,驱动智能制造
5G技术在工业4.0中的应用:连接未来,驱动智能制造 引言 工业4.0,作为第四次工业革命的核心,已经在全球范围内掀起了智能制造的浪潮。它不仅包括了自动化生产、智能物流、云计算和大数据的应用,更是融合了互联网、物联网…...
驱动开发硬核特训 · Day 25 (附加篇):从设备树到驱动——深入理解Linux时钟子系统的实战链路
一、前言 在嵌入式Linux开发中,无论是CPU、外设控制器,还是简单的GPIO扩展器,大多数硬件模块都离不开时钟信号的支撑。 时钟子系统(Clock Subsystem),作为Linux内核中基础设施的一部分,为设备…...
数据结构---单链表的增删查改
前言: 经过了几个月的漫长岁月,回头时年迈的小编发现,数据结构的内容还没有写博客,于是小编赶紧停下手头的活动,补上博客以洗清身上的罪孽 目录 前言 概念: 单链表的结构 我们设定一个哨兵位头节点给链…...
【codeforces 2104D,E】欧拉筛,字符串上dp
【codeforces 2104D,E】欧拉筛,字符串上dp Problem - D - Codeforces 题意: 给定一个长度为 n n n的数组 a 1 , a 2 , . . . , a n a_1, a_2, ... , a_n a1,a2,...,an,其中 2 ≤ a i ≤ 1 0 9 2 \leq a_i \leq 10^9 2≤…...
UEC++第15天|番茄插件、实现跳跃、实现背景运动
这是flyBird的第二天,做了一些简单的功能,明天继续更新 vs的番茄插件 在visual stdudio里使用可以帮助代码补全,这一篇博客写的不错,大家可以参考一下。VS2019 安装番茄助手(Visual Assist x 插件)攻略_vs…...
论文笔记-基于多层感知器(MLP)的多变量桥式起重机自适应安全制动与距离预测
《IET Cyber-Systems and Robotics》出版山东大学 Tenglong Zhang 和 Guoliang Liu 团队的研究成果,文章题为“Adaptive Safe Braking and Distance Prediction for Overhead Cranes With Multivariation Using MLP”。 摘要 桥式起重机的紧急制动及其制动距离预测是…...
[论文阅读]Adversarial Semantic Collisions
Adversarial Semantic Collisions Adversarial Semantic Collisions - ACL Anthology Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing (EMNLP) 对抗样本是相似的输入但是产生不同的模型输出,而语义冲突是对抗样本的逆…...
Redis Sentinel 和 Redis Cluster 各自的原理、优缺点及适用场景是什么?
我们来详细分析下 Redis Sentinel (哨兵) 和 Redis Cluster (集群) 这两种方案的原理和使用场景。 Redis Sentinel (哨兵) 原理: Sentinel 本身是一个或一组独立于 Redis 数据节点的进程。它的核心职责是监控一个 Redis 主从复制 (Master-Slave) 架构。多个 Sentinel 进程协同…...
面向人工智能、量子科技、人形机器人等产业,山东启动制造业创新中心培育认定
从山东省工业和信息化厅了解到,2025年山东省制造业创新中心培育和认定已启动,重点面向全省传统优势产业、新兴产业及未来产业等领域,鼓励具备条件的龙头企业牵头创建省制造业创新中心。 今年,山东重点面向全省冶金、化工、轻工、…...
无锡哲讯科技:SAP财务系统——赋能企业智慧财务管理
数字化时代,财务管理的新挑战 在全球化竞争和数字经济快速发展的背景下,企业财务管理正面临前所未有的挑战。传统的财务核算方式效率低下、数据孤岛严重、决策滞后,难以满足现代企业高效运营的需求。如何实现财务数据的实时整合࿱…...
Linux命令使用记录(自用)
阿里开源镜像站:https://developer.aliyun.com/mirror/?spma2c6h.13651102.0.0.6c2a1b11I9pmUD&serviceTypemirror&tag top命令 top [选项] -p 只显示某个进程的信息 -d 设置刷新时间,默认是5s -c 显示产生进程的完整命令,默认是进程…...
Spring Security 的 CSRF 防护机制
CSRF:跨站请求伪造(Cross-Site Request Forgery) Spring Security 中的 .csrf() 是用来开启或配置这种保护机制,防止恶意网站“冒充用户”向你的网站发起请求。 一、CSRF 攻击原理简要 CSRF 的典型攻击场景如下: 用…...
跨平台项目部署全攻略:Windows后端+Mac前端在服务器的协同实战
当你的后端(Flask+MySQL,Windows开发)与前端(Vue,Mac开发)需要统一部署到服务器并实现交互时,完全可以通过「跨平台适配+反向代理」方案实现。本文将分步骤讲解如何在 Linux服务器(推荐)或 Windows服务器 上部署,并解决跨平台兼容性、跨域请求等核心问题。 一、技术…...
第八章 磁盘管理未完待续
1.磁盘管理 磁盘简介 名词:磁盘/硬盘/disk 存储设备类型从工作原理区分 机械 机械硬盘即是传统普通硬盘,主要由:盘片,磁头,盘片转轴及 控制电机,磁头控制器,数据转换器,接口&…...
杰理AC79-WiFi 的 AP、STA 和 Monitor 模式
WiFi 的 AP、STA 和 Monitor 模式是无线网卡的不同工作模式,它们的区别如下: AP 模式(Access Point 模式,接入点模式) 功能:将有线网络转换为无线网络,允许其他无线设备连接到该网络ÿ…...
MAC安装unar并解压.rar文件
MAC上默认解压.zip文件,对.rar文件进行解压需要安装专门对软件。本文记录如何在命令行安装unar并对.rar文件进行解压。 命令行安装 brew install unar打印如下log则安装成功 使用brew list unar检查是否安装成功 brew list unar使用unar解压 unar 文件名.rar...
`nmi_watchdog` 与 `softlockup_panic` 的区别与关系
1. 功能区别 参数作用触发条件影响nmi_watchdog启用 NMI(不可屏蔽中断)看门狗检测 CPU 是否长时间不执行调度(软死锁)仅记录警告(默认),需配合 softlockup_panic 才会触发 panicsoftlockup_pan…...
【Bash】可以请您解释性地说明一下“2>1”这个语法吗?
Qwen3-235B 当然可以!我们一步步拆解 2>&1 的含义,用生活化的例子来理解它: 🧠 前提知识:三个“水流通道” 在 Linux/Unix 系统中,程序运行时有三种默认的“水流通道”: 标准输入&…...
打造美观 API 文档:Spring Boot + Swagger 实战指南
目录 打造美观 API 文档:Spring Boot Swagger 实战指南导语一、Swagger 简介二、Spring Boot 2 集成 Swagger1. 添加依赖2. 配置 Swagger3. 访问 Swagger UI 三、Spring Boot 3 集成 Swagger1. 添加依赖2. 配置 Swagger3. 访问 Swagger UI 四、多种接口文档风格展示…...
如何在 Android 上恢复已删除的照片?:简短指南
没有什么比不小心从 Android 智能手机中删除所有照片更糟糕的了。这样,除非您在重置之前已经备份了数据,否则您的所有照片都会消失。如果您忘记备份照片,您仍然可以按照一些简单的技术在 Android 设备上恢复已删除的照片。 如何在 Android 上…...
第十六届蓝桥杯大赛网安组--几道简单题的WP
目录 1. ezEvtx 2.flowzip 3.Enigma 4.星际XML解析器 1. ezEvtx 题目内容 EVTX文件是Windows操作系统生成的事件日志文件,用于记录系统、应用程序和安全事件。(本题需要选手找出攻击者访问成功的一个敏感文件,提交格式为flag{文件名},其中…...
Element:Cheack多选勾选效果逻辑判断
效果展示 取消子级勾选,父级的勾选效果 代码合集 (1)组件代码 fromlist.cheackType 类型,permissio表示是权限. fromlist:[{id:1,children:[{...}]},...]传递的数据大致结构 <!-- 操作权限 --><template v-if"…...
从摄像头到 RAW 数据:MJPEG 捕获与验证
从摄像头捕获 MJPEG 原始数据:完整指南与验证方法 🔍 引言 MJPEG(Motion JPEG)是一种常见的视频压缩格式,广泛应用于摄像头、监控系统和嵌入式设备。在某些场景下,我们需要直接从摄像头获取 MJPEG 原始数据…...
【展位预告】正也科技将携营销精细化管理解决方案出席中睿营销论坛
在医药行业面临政策深化、技术迭代、全球化竞争的多重挑战下,第二届中睿医药健康生态生长力峰会暨第三十五届中睿医药营销论坛将于广州盛大启幕。5月19-20日本次峰会以“聚焦政策变革、把握产业趋势、构建生态共赢”为核心,旨在通过全产业链资源整合与创…...
记录 Flink jdbc、mysql-cdc 连接 mysql8 碰到的适配问题
前言 记录 Flink jdbc、mysql-cdc 连接 mysql8 碰到的小问题 版本 Flink 1.15.3mysql-cdc 2.3.0MySQL 8.0.27 cdc_mysql2mysql MySQL5 之前主要用 MySQL5 ,下面是 MySQL5 的 sql ,具体见 Flink MySQL CDC 使用总结 set yarn.application.namecdc_mysql2mysql;…...
TCP概念+模拟tcp服务器及客户端
目录 一、TCP基本概念 二、ser服务器代码 三、cil客户端代码 一、TCP基本概念 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。以下是TCP的一些基本概念: 面向连接&…...
高翔《视觉SLAM十四讲》第七章视觉里程计3d-2d位姿估计代码详解与理论解析
高翔《视觉SLAM十四讲》第七章代码详解与理论解析 一、三维空间位姿估计核心算法实现 在视觉SLAM领域,3D - 2D位姿估计是确定相机在三维空间中位置和姿态的关键技术。本部分将详细解析其工程实现框架,同时说明代码模块的划分逻辑。 代码整体结构清晰,各模块分工明确,主要…...
Elasticsearch 内存使用指南
作者:来自 Elastic Valentin Crettaz 探索 Elasticsearch 的内存需求以及不同类型的内存统计信息。 Elasticsearch 拥有丰富的新功能,帮助你为你的使用场景构建最佳搜索解决方案。浏览我们的示例笔记本了解更多信息,开始免费云试用࿰…...
【Stable Diffusion】原理详解:从噪声到艺术的AI魔法
引言 Stable Diffusion是 stability.ai 开源的图像生成模型,是近年来AI生成内容(AIGC)领域最具突破性的技术之一。它通过将文本描述转化为高分辨率图像,实现了从“文字到视觉”的创造性跨越。其开源特性与高效的生成能力ÿ…...
并发设计模式实战系列(9):消息传递(Message Passing)
🌟 大家好,我是摘星! 🌟 今天为大家带来的是并发设计模式实战系列,第九章消息传递(Message Passing),废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 消息传递架构 2. 并发…...
【MCP Node.js SDK 全栈进阶指南】高级篇(3):MCP 安全体系建设
背景 随着MCP协议在企业和个人应用中的广泛采用,安全性已成为MCP系统设计和开发中不可忽视的核心要素。一个健壮的MCP安全体系不仅能保护敏感数据和用户隐私,还能确保AI模型与外部工具交互的可靠性和完整性。本文将深入探讨MCP TypeScript-SDK的安全体系建设,帮助开发者构建…...
C++智能指针
智能指针是C中用于自动管理动态分配内存的类模板,它们通过在适当的时机自动释放内存来帮助防止内存泄漏。C11引入了以下几种主要的智能指针: 1. std::unique_ptr 独占所有权的智能指针,同一时间只能有一个unique_ptr指向特定对象。 #inclu…...
基于STM32、HAL库的ATECC608B安全验证及加密芯片驱动程序设计
一、简介: ATECC608B是Microchip公司生产的一款安全加密芯片,提供以下主要特性: 基于硬件的高安全性加密算法 ECC P-256加密引擎 SHA-256哈希算法 AES-128加密 真随机数生成器(TRNG) 16KB安全存储空间 IC接口(最高1MHz) 低功耗设计,适合物联网应用 二、硬件接口: ATECC60…...
【安全扫描器原理】ICMP扫描
【安全扫描器原理】ICMP扫描 1.ICMP协议概述2.ping命令3.tracert命令4.ICMP通信实例5.ICMP协议内容6.ICMP扫描的安全性7.ICMP扫描器的原理及优化策略1.ICMP协议概述 ICMP是TCP/IP协议族中的一个重要协议,主要用于在IP主机之间、主机和路由器之间传递控制消息,这些控制消息包…...
前端 AI 开发实战:基于自定义工具类的大语言模型与语音识别调用指南
在人工智能技术快速发展的今天,将大语言模型(LLM)和语音识别(ASR)功能集成到前端应用中,已经成为提升用户体验、打造智能化应用的重要手段。本文将结合一段实际的 AI 工具类代码,详细讲解如何在…...
组件轮播与样式结构重用实验
任务一:使用“Swiper 轮播组件”对自行选择的图片和文本素材分别进行轮播,且调整对应的“loop”、“autoPlay”“interval”、“vertical”属性,实现不同的轮播效果,使用Swiper 样式自定义,修改默认小圆点和被选中小圆…...