【C++11】包装器:function与bind
前言:
上文我们学了C++11中一个新的表达式:Lambda表达式。Lambda表达式可以在函数内部定义,其本质是仿函数【C++11】Lambda表达式-CSDN博客
本文我们来学习C++11的下一个新语法:包装器
function
function的定义为:
template <class T>
class function; // undefinedtemplate <class Ret, class... Args>
class function<Ret(Args...)>;
function的一个类模板,也是一个包装器。function的实例对象可以包装调用一切可调用对象。但若function的对象为被初始化,进行调用就会报错(抛异常:std::bad_function_call)
function模板类放在<functional>头文件中
使用function包装不同的可调用对象,就可以用相同的方式调用不同可调用对象。
function的本质其实也是仿函数
使用细节如下:
#include<iostream>
#include<functional>
using namespace std;
//function可以包装一切可调用对象,其本质是仿函数//template <class Ret, class... Args>
//class function<Ret(Args...)>;int f(int a, int b)
{return a + b;
}struct Functor
{int operator() (int a, int b){return a - b;}
};class Plus
{
public:Plus(int n = 10):_n(n){}static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return (a + b) * _n;}private:int _n;
};int main()
{//可包装一切可调用对象function<int(int, int)> a = f;function<int(int, int)> b = Functor();function<int(int, int)> c = [](int a, int b) {return a * 10 + b; };cout << a(1, 2) << endl;cout << b(1, 2) << endl;cout << c(1, 2) << endl;//既然说function可以包装一切可调用对象,那么类成员函数既然也可以被包装//包装静态成员函数: 1.必须要指定类域,2.非静态成员必须要取地址,但是静态不用,为了同一格式建议加上function<int(int, int)> x = &Plus::plusi;cout << x(1, 2) << endl;//包装非静态成员函数:1.必须要指定类域 2.必须取地址 3.非静态成员函数有this指针function<int(Plus*,int, int)> y = &Plus::plusd;Plus p;cout << y(&p, 1, 2) << endl;//也可以直接传对象,因为:类成员函数的调用是通过 .* 运算符实现的//前面传指针,也是先将指针解引用为对象,再通过 .* 运算符调用成员函数function<int(Plus, int, int)> z = &Plus::plusd;cout << z(p, 1, 2) << endl;//与直接传对象类似,引用是为了减少拷贝,提高效率function<int(Plus&&, int, int)> q = &Plus::plusd;cout << q(move(p), 1, 2) << endl;function<int(Plus&, int, int)> w = &Plus::plusd;cout << w(p, 1, 2) << endl;
}
包装其他可调用对象,没什么区别,唯独需要注意当我们在包装类成员函数时有一些不同:
包装静态成员函数时:1.必须要指定类域,2.非静态成员必须要取地址,但是静态不用,为了统一格式建议加上。
包装非静态成员函数时:1.必须要指定类域 2.必须取地址 3.非静态成员函数有this指针。
练习:150. 逆波兰表达式求值 - 力扣(LeetCode)
#include<iostream>
#include<vector>
#include<functional>
#include<map>
#include<stack>
#include<string>
using namespace std;class Solution
{
public:int evalRPN(vector<string>& tokens){stack<int> s;//使用map将运算符与运算逻辑匹配//使用Lambda实现运算逻辑//利用function包装Lambdamap<string, function<int(int, int)>> m ={{"+",[](int a,int b) {return a + b; }},{"-",[](int a,int b) {return a - b; }},{"*",[](int a,int b) {return a * b; }},{"/",[](int a,int b) {return a / b; }}};for (auto& e : tokens){//当count返回不是0,说明当前的字符是"+ - * /"中的一个//取两个操作数,进行相应的运算if (m.count(e)){int left = s.top();s.pop();int right = s.top();s.pop();//operator[]返回function对象的引用//function对象直接调用Lambda表达式int num = m[e](right, left);s.push(num);}else{s.push(stoi(e));//stoi函数:将字符串转化为整型}}return s.top();}
};int main()
{vector<string> arr = { "4","13","5","/","+" };cout << Solution().evalRPN(arr);
}
bind
bind的定义:
simple(1)
template <class Fn, class... Args>/* unspecified */ bind (Fn&& fn, Args&&... args);with return type (2)
template <class Ret, class Fn, class... Args>/* unspecified */ bind (Fn&& fn, Args&&... args);
bind的一个模板函数,也是一个包装器,可以将其看作一个函数适配器。bind接收一个函数处理后会返回一个可调用对象。bind的功能:调整函数参数顺序、控制函数参数个数。
调用bind的一般形式为:auto newCallable = bind(callable,arg_list);callable是函数地址,newCallable是可调用对象,调用newCallable会将arg_list的参数传给callable,然后调用callable。bind的底层和function一样都是仿函数,所以也可以用function代替auto来接收bind的返回对象。
在arg_list中有一个特殊概念:占位符。假设有n个参数,那占位符至多有n个:_1 , _2 , _3 , ....... , _n。_1代表第一个参数,_2代表第二个参数,........ ,_n代表第n个参数。这些占位符放在placeholders命名空间。
使用样例:
#include<iostream>
#include<functional>
using namespace std;
//bind的占位符都放在这个命名空间里
using namespace placeholders;//bind有两个作用:1.交换参数顺序 2.绑定参数,控制参数个数(常用)
//bind的本质和function一样都是仿函数class Plus
{
public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a + b;}
};int add(int a, int b)
{return a - b;
}int add1(int a, int b, int c)
{return a * 10 + b - c;
}int main()
{//调整参数顺序(没什么用处)auto e = bind(add, _1, _2);cout<<e(2, 3)<<endl;auto x = bind(add, _2, _1);cout << x(2, 3) << endl;//调整参数个数(常用)//直接绑定第1、2、3的参数,传参的时候只用传未绑定的参数auto c = bind(add1, 10, _1, _2);cout << c(1,2) << endl;auto d = bind(add1, _1, 10, _2);cout << d(1, 2) << endl;auto w = bind(add1, _1, _2, 10);cout << w(1, 2) << endl;//bind常用于绑定固定参数//function<double(Plus*,double, double)> f = &Plus::plusd;function<double(double, double)> f = bind(&Plus::plusd, Plus(), _1, _2);cout<<f(1, 2)<<endl;}
总的来看,bind有用的功能主要是控制函数参数个数,常用于绑定一些固定的参数。
相关文章:
【C++11】包装器:function与bind
前言: 上文我们学了C11中一个新的表达式:Lambda表达式。Lambda表达式可以在函数内部定义,其本质是仿函数【C11】Lambda表达式-CSDN博客 本文我们来学习C11的下一个新语法:包装器 function function的定义为: templat…...
Educational Codeforces Round 178 div2(题解ABCDE)
A. Three Decks #1.由于最后三个数会相等,提前算出来和,%3判断,再判前两个数是否大于 #include<iostream> #include<vector> #include<stdio.h> #include<map> #include<string> #include<algorithm> #…...
mermaid 序列图 解析
sequenceDiagramparticipant UI as 用户界面participant Executor as 任务执行器participant StateMgr as 状态管理器participant Repo as 数据仓库UI->>Executor: 执行任务3350c74e...Executor->>StateMgr: 更新状态为"measuring"StateMgr->>Repo…...
DTO,VO,PO,Entity
1. DTO (Data Transfer Object) 定义 DTO 是数据传输对象,用于在不同系统或层之间传输数据。 目的 简化数据传输,降低耦合,通常只包含需要传输的字段,避免暴露内部实现细节。 使用场景 Controller 和 Service 或 远程调用 之…...
Proser:重新介绍
回想Proser的定位:一款直观的【协议发送】模拟软件。 现在间断更新下来,基本成了一款通信调试助手类软件 Proser 是一款支持串口与网络的通信调试助手,其独有的协议编辑器、数据检视、标尺等功能,让指令模拟与数据分析更加易用。…...
微信小程序 首页之轮播图和搜索框 代码分享
注意!!! 只有样式,还没功能开发!!! index.wxml <!-- 搜索框 --> <view class"search"><input placeholder"请输入搜索的内容"></input><imag…...
3D可视化编辑器模版
体验地址:http://mute.turntip.cn 整个搭建平台核心模块包含如下几个部分: 3D场景渲染 组件拖拽系统 元素编辑功能 状态管理 历史记录与撤销/重做 技术栈 前端框架与库 React 18 用于构建用户界面的JavaScript库 Next.js 14 React框架,提供服…...
foc控制 - clarke变换和park变换
1. foc控制框图 下图是foc控制框图,本文主要是讲解foc控制中的larke变换和park变换clarke变换将 静止的 a b c abc abc坐标系 变换到 静止的 α β αβ αβ坐标系,本质上还是以 定子 为基准的坐标系park变换 则将 α β αβ αβ坐标系 变换到 随 转…...
DeepSeek: 探索未来的深度学习搜索引擎
深度学习驱动的下一代搜索引擎:DeepSeek 在信息爆炸的时代,搜索引擎作为连接用户与互联网世界的桥梁,其重要性不言而喻。然而,随着用户需求的日益多样化和复杂化,传统搜索引擎在理解和满足用户需求方面逐渐显现出局限…...
如何在本地部署小智服务器:从源码到全模块运行的详细步骤
小智聊天机器人本地后台服务器源码全模块部署 作者:林甲酸 -不是小女子也不是女汉子 是大女子 更新日期:2025年4月29日 🎯 前言:为什么要写这篇教程? 上周按照虾哥小智服务器的教程去部署本地后台,我用的是…...
基于论文的大模型应用:基于SmartETL的arXiv论文数据接入与预处理(四)
上一篇介绍了基于SmartETL框架实现arxiv采集处理的基本流程,通过少量的组件定制开发,配合yaml流程配置,实现了复杂的arxiv采集处理。 由于其业务流程复杂,在实际应用中还存在一些不足需要优化。 5. 基于Kafka的任务解耦设计 5.…...
GrapesJS 终极定制组件设计方案:扁平化对象属性编辑、多区域拖拽、多层嵌套与组件扩展实战
掌握 GrapesJS 复杂组件实用技巧,打造高复用、高交互的前端低代码组件体系 随着低代码可视化编辑需求日益提升,GrapesJS 作为优秀开源画布编辑器,灵活的组件机制是其核心优势。但在实际项目中,你可能会遇到: 如何编辑…...
Spring MVC 如何映射 HTTP 请求到 Controller 方法?
我们来详细分析一下如何在 Spring MVC 中将 HTTP 请求映射到 Controller 的处理方法(Handler Methods)上,以及 RequestMapping 注解的使用方法。 请求映射的核心:RequestMapping 注解 RequestMapping 是 Spring MVC 中最核心、最…...
vue.js中的一些事件修饰符【前端】
不要一直责怪过去的自己,他独自站在雾里也很迷茫。 目录 .stop:.prevent:.self:.once:.capture:.native:何时使用 .native? .stop: 作用:调用 event.stopPro…...
WEBSTORM前端 —— 第2章:CSS —— 第4节:盒子模型
目录 1.画盒子 2.Pxcook软件 3.盒子模型——组成 4.盒子模型 ——边框线 5.盒子模型——内外边距 6.盒子模型——尺寸计算 7.清除默认样式 8.盒子模型——元素溢出 9.外边距问题 ①合并现象 ②塌陷问题 10.行内元素——内外边距问题 11.盒子模型——圆角 12.盒子…...
Cursor —— AI编辑器 使用详解
Cursor - The AI Code Editor 一、Cursor 是什么? Cursor 是一款优秀的AI代码编辑器,它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说,就是:Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性(代码补全、…...
故障诊断——复现github代码ClassBD-CNN(BDCNN)
刚好看到这篇文献有github代码,而且也比较新,感觉可以当作自己论文中的对比方法。 https://www.sciencedirect.com/science/article/pii/S0888327024006484 (论文地址) (看到4090,有点想劝退自己......&…...
局部和整体的关系
Prompt:为什么要研究局部和整体的关系呢?是因为很多情况下,局部就能表达出整体? 这是一个非常本质的问题,其实你已经接近数学和物理中“几何本质”的核心了。我们研究局部和整体的关系,是因为:…...
1.5 点云数据获取方式——双目立体相机
图1-5-1 双目立体相机 双目相机通过模拟人眼立体视觉,利用两个摄像头的视差信息计算物体深度,进而生成 3D 点云,具有成本低、体积小、信息丰富等优势,成为中...
Flume启动报错
报错1: 报错2: File Channel transaction capacity cannot be greater than the capacity of the channel capacit... 解决方案:删除配置...
leetcode 21. 合并两个有序链表(c++解法+相关知识点复习)
目录 题目 所需知识点复习 1.链表 1.1单链表 1.2哑结点(Dummy Node) 解答过程 1.循环双指针解法 2.递归解法 2025.4.29想到其他知识点会后续再继续补充。 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表…...
链表反转_leedcodeP206
P206反转链表 原题 反转思路 将链表反转的过程分为两个区域: 🟦 未反转区(待处理) 原链表中还没有处理(还没有反转指针方向)的部分,从 current 开始一直到链表尾部。 🟩 已反转…...
Laravel+API 接口
LaravelAPI 接口 网课连接:BIlibili. 中文文档. 1.RestFul Api编码风格 一、API设计 修改hosts,C:\Windows\System32\drivers\etc\hosts,增加127.0.0.1 api.lv8.com # Laravel 框架 用这个域名来测试(推荐规范) 在…...
在 Ubuntu 上离线安装 ClickHouse
在 Ubuntu 上离线安装 ClickHouse 的步骤如下: 一.安装验证 # 检查服务状态 sudo systemctl status clickhouse-server #删除默认文件 sudo rm /etc/clickhouse-server/users.d/default-password.xml # 使用客户端连接 clickhouse-client --password...
【AI微信小程序开发】掷骰子小程序项目代码:自设骰子数量和动画(含完整前端代码)
系列文章目录 【AI微信小程序开发】AI减脂菜谱小程序项目代码:根据用户身高/体重等信息定制菜谱(含完整前端+后端代码)【AI微信小程序开发】AI菜谱推荐小程序项目代码:根据剩余食材智能生成菜谱(含完整前端+后端代码)【AI微信小程序开发】图片工具小程序项目代码:图片压…...
Linux-02-VIM和VI编辑器
第一节:什么是VI和VIM编辑器: VI是Unix和类Unix操作系统中出现的通用的文本编辑器。VIM是从VI发展出来的一个性能更强大的文本编辑器可以主动的以字体颜色辨别语法的正确性,方便程序设计,VIM和VI编辑器完全兼容。使用:vi xxx文件 或者vim xxx文件,简单来说就是用来编辑文件的一…...
同为科技 智能PDU产品选型介绍-EN10/G801FR
随着各行业对数据中心机房重视程度的不断提高, 加强机柜微环境及电源计量、监控和管理则十分必要。在新型微模块化数据中心供配电系统建设中,UPS电源、智能PDU、监控管理系统、资产管理等产品早已成为IDC机房不可或缺的部分。其中,智能PDU通过…...
NS-SWIFT微调Qwen3
目录 一、NS-SWIFT简介 二、Qwen3简介 三、微调Qwen3 1、安装NS-SWIFT环境 2、准备训练数据 3、Lora微调 4、GROP训练 5、Megatron并行训练 一、NS-SWIFT简介 SWIFT(Scalable lightWeight Infrastructure for Fine-Tuning)是魔搭ModelScope开源社…...
借 AI 热潮,深挖 [风车 AI ] 为跨境电商打造的图片翻译黑科技
家人们,这几年 AI 技术简直像坐了火箭一样飞速发展,生活里、工作中到处都能看到它的身影。对咱们跨境行业来说,语言翻译一直是个让人头疼的大问题。今天咱就借着这股 AI 热潮,好好深挖一下风车 AI 为跨境打造的那些超厉害的翻译黑…...
uni-app 中封装全局音频播放器
在开发移动应用时,音频播放功能是一个常见的需求。无论是背景音乐、音效还是语音消息,音频播放都需要一个稳定且易于管理的解决方案。在 uni-app 中,虽然原生提供了 uni.createInnerAudioContext 方法用于音频播放,但直接使用它可…...
Uniapp:设置TabBar
目录 一、setTabBarBadge:增加文本二、removeTabBarBadge:移除文本三、showTabBarRedDot:显示红点四、hideTabBarRedDot:隐藏红点一、setTabBarBadge:增加文本 为 tabBar 某一项的右上角添加文本。 uni.setTabBarBadge({index: 0,text: 1 })参数类型必填说明indexNumber…...
如何查看k8s获取系统是否清理过docker镜像
k8s集群某个节点down掉后,pod就会漂移到其他节点,但是在该节点却又执行了拉取镜像操作,明明该节点之前部署过该容器的,不知为什么又拉取了一次镜像(镜像拉取配置的优先使用本地),所以怀疑是触发…...
【Linux网络】深入解析I/O多路转接 - Select
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
如何解决 Xcode 签名证书和 Provisioning Profile 过期问题
在 iOS 应用开发过程中,签名证书和 Provisioning Profile 是确保应用安全性和合法性的关键组件。然而,当这些证书或配置文件过期时,开发者可能会遇到编译或归档失败的问题。本文将详细介绍如何解决 Xcode 中“iOS Distribution”证书未找到和…...
[C++]C++20协程的原理
文章目录 协程的状态机Promise 对象挂起和恢复机制协程的执行流程示例代码分析 C 协程是 C20 引入的一项重要特性,它提供了一种更简洁、高效的异步编程方式。下面从协程的状态机、Promise 对象、挂起和恢复机制等方面介绍其底层实现原理。 协程的状态机 从底层角度…...
Oracle OCP证书有效期是三年?
这一段时间,网上经常传出消息Oracle OCM认证证书有效期为三年,其实这个假消息,通过博睿谷与Oracle官方人员确认,OCP认证证书有效期是永久的。 OCP证书本身永久有效,但老版本的OCP证书代表着更多的项目经验,…...
2025.4.29_STM32_看门狗WDG
1.WDG简介 大概意思就是给看门狗设置一个时间范围,在这个范围内必须喂狗(重置定时器),这个操作必须一直执行,比如看门狗的的时间范围是1-2秒,我们就必须间隔1-2秒就喂一次狗,否则它自减到0时就会重置电路,相…...
基于Java,SpringBoot,HTML水文水质监测预警系统设计
摘要 随着水资源管理需求的日益增长,构建高效、精准的水文监测预警系统至关重要。本文设计并实现了一套基于 Java、SpringBoot 和 HTML 技术的水文监测预警系统。系统采用 Java 语言与 SpringBoot 框架搭建后端服务,利用其强大的业务逻辑处理能力与高效…...
Qt开发:JSON字符串的序列化和反序列化
文章目录 一、构建和解析单个JSON对象二、JSON对象中嵌套多个JSON对象三、JSON对象中组建多个数组对象四、构建和解析数组对象 一、构建和解析单个JSON对象 1.1 JSON对象的构建 使用key-value形式生成JSON对象 #include <QJsonObject> #include <QJsonDocument> …...
第10次:电商项目配置开发环境
本次内容主要为给整个电商项目配置好开发环境,包括如下环节: 创建电商项目xiaoyu_mall,Django版本默认是最新的大版本5.2配置应用目录,因项目会涉及到多个应用,为保证项目结构清晰,将在项目下建立apps目录…...
【强化学习系列】Q-learning——从贝尔曼最优方程谈起
引言 上一篇贝尔曼最优方程中我们已经推导出动作价值形式的贝尔曼最优方程: q π ∗ ( s , a ) ∑ s ′ ∈ S ∑ r ∈ R p ( s ′ , r ∣ s , a ) [ r γ max a ′ q π ∗ ( s ′ , a ′ ) ] \begin{equation}q_{\pi^*}(s,a)\sum_{s\in S}\sum_{r\in R}p(s,…...
Java 基础--运算符全解析
【Java 基础】Java 运算符全解析:程序世界的“加减乘除”与“是非对错” 作者:IvanCodes 发布时间:2025年4月29日🐣 专栏:Java教程 嗨,各位 Java 探险家们!👋 掌握了变量、数据类…...
【神经网络与深度学习】改变随机种子可以提升模型性能?
引言 随机种子在机器学习和数据处理领域中至关重要,它决定了模型训练、数据划分以及参数初始化的随机性。虽然固定随机种子能确保实验的可重复性,但改变随机种子有时会意外提升模型性能。本文将探讨这一现象的潜在原因,并揭示随机性如何影响…...
一页概览:统一数据保护方案
2010年左右手绘,用的是公司的信纸,签字笔,马克笔。方案为统一数据保护。其实解释备份软件加备份硬件(支持重复数据删除)的联合解决方案。...
Python中的itertools模块常见函数用法示例
itertools ,迭代工具模块,提供了用于高效处理迭代器和组合问题的工具。 1. itertools.permutations(iterable, rNone) 功能:生成输入迭代器的所有可能排列。 参数: iterable:输入的可迭代对象。r:可选参数…...
微服务学习笔记
1 微服务 微服务:基于业务领域建模的、可独立发布的服务,把业务内聚的功能封装起来,并通过网络供其他服务访问。 好处: 技术异构性,不同服务可以使用不同的技术弹性,可以更好的处理服务不可用的问题扩展…...
实验七:基于89C51和DS18B20的温度采集与显示
一、实验目的 学习使用DS18B20数字温度传感器采集温度数据。使用4位共阳极数码管显示温度数据,显示精度到小数点后两位。熟悉89C51单片机的I/O口操作和位选控制。二、实验器材 89C51单片机开发板DS18B20数字温度传感器4位共阳极数码管三极管8550(用于位选驱动)电阻、电容等辅…...
cmake:基础
本文主要探讨cmake语法相关知识。 cmake(GUI)安装 apt install cmake-curses-gui cmake -y cmake语法 cmake_minimum_required(VERSION 版本号) 设置cmake最低版本 project(工程名) <> PROGECT_NAME/CMAKE_PROJECT_NAME 设置工程名字 add_library(库名 SHARED/STAT…...
1.8 点云数据获取方式——小结
点云,作为三维空间信息的直观载体,在各行各业都得到了广泛应用。而能够获得三维点云数据手段,也是极为丰富。本章节主要介绍了主动式手段(包括激光雷达、ToF相机、结构光相机)和被动式手段(双目立体相机、单…...
超越单体:进入微服务世界与Spring Cloud概述
大家好!欢迎来到我的新系列文章——《微服务架构:Spring Cloud实战指南》。在之前的《Java服务端核心技术》系列中,我们一起深入学习了如何使用Spring Boot构建功能强大、安全可靠的单体应用程序。我们掌握了Spring的核心原理、Web开发、数据…...