C++高级特性:柯里化过程与std::bind(六)
1、柯里化过程
1.1、operator()的引入
现在需要完成这样一个需求:有一个函数每次调用返回的结果不一样。例如:两次调用的返回值都不一样那么就可以达到这种目的
1.1.1、简单点的写法
可以给一个全局的变量(静态变量),每次调用对这个全局变量进行值的修改然后返回,这样每次返回都不一样。
#include <iostream>
int nums;
int func()
{return ++nums;
}int main() {std::cout << "Hello, World!" << std::endl;std::cout << std::boolalpha << (func() == func()) << std::endl;return 0;
}
1.1.2、operator()重载
如果需要用类来完成,那么可以使用operator()仿函数来做,仿函数其实是一个特殊的函数。
class Functor{
public:int x;int operator()(){return ++x;}
};
void test2()
{Functor func;std::cout << std::boolalpha << (func() == func()) << std::endl;
}
1.2、Chain Adding
有了上面的基础,可以看这样一个题目:
- 打算创建一个函数,这个函数能够完成类似于add(1) = 1、add(1)(2) = 3、add(1)(2)(3) = 6…类似于这种求和的操作。
- 并且能够判断出add(1) == 1这种判断也能完成,以及add(1) + 3、add(1) - 3
- 意思没出现一个括号就会对之前的值进行一个加法和减法
通过分析可以看到add(1)应该返回一个类似函数的东西func,然后这个东西还可以继续func(2)…可以尝试使用上面的仿函数来继续,
- 很明显这里有一个链式编程的东西,返回的东西应该是一个类对象本身的引用这样就可以继续链式,当然也可以返回一个普通类型但是要做好拷贝构造。
- 对于不同类型的比较,那么肯定需要重载一下==符号进行判断值是否相等即可。
- 对于第三个操作很明显需要重载加减法么,一样需要注意返回引用或者拷贝构造的对象。
- 思考:如果需要流输出类对象应该怎么做呢?答案:重载输出流
- 补充:其实还可以把类型进行重载,把当前类中的返回类型重载为int可以直接省略判断、加减和输出操作
class Functor{
public:int sum;Functor(): sum(0){}Functor(int x): sum(x){}Functor& operator()(int val){this->sum += val;return *this;}bool operator== (const int x) const{return sum == x;}Functor& operator-(int x){this->sum -= x;return *this;}Functor& operator+(int x){this->sum += x;return *this;}friend std::ostream & operator<<(std::ostream& out, const Functor& functor){out << functor.sum << std::endl;return out;}
// operator int() { //可以直接替换 == 重载、 加减法、输出流
// return this->sum;
// }
};int main()
{Functor f1;f1(1);std::cout << f1.sum << std::endl;Functor f2;f2(1)(2);std::cout << f2.sum << std::endl;Functor f3;std::cout << std::boolalpha << (f3(1) == 1)<< std::endl;Functor f4(1);f4 = f4 - 2;f4 = f4 + 5;std::cout << f4.sum << std::endl;std::cout << f4 << std::endl;return 0;
}
其实这是一个很好的例子,可以帮助我们理解重载的意义和C++面向对象的灵活使用。
1.3、柯里化过程
其实上面的链式编程或者函数式编程就是一个柯里化的过程,其实这种操作在lambda表达式也有体现的,lambda表达式中继续lambda表达式
// add(1, 2) --> add(1)(2)
void test4()
{auto add = [](int x)->auto{return [x](int y) -> auto{return x + y;};};std::cout << add(1)( 2) << std::endl;
}
2、std::bind
- 有了上面函数式编程和柯里化的过程,理解bind就很简单了。
- std::bind主要用于给函数进行参数绑定的
#include <iostream>
#include <functional>int add(int a, int b)
{std::cout << "a = " << a << ", b = " << b <<std::endl;return a + b;
}
int main()
{using namespace std::placeholders;auto f1 = std::bind(add, 1, _1);std::cout << f1(2) << std::endl;auto f2 = std::bind(add, _1, 1);std::cout << f2(2) << std::endl;std::cout << std::bind(add, 1, _1)(2) << std::endl;std::cout << std::bind(add, _1, _2)(3, 4) << std::endl;std::cout << std::bind(add, _2, _1)(3, 4) << std::endl;std::cout << std::bind(add, _1, _1)(3, 4) << std::endl;std::cout << std::bind(add, _2, _2)(3, 4) << std::endl;// C++20标准
// std::cout << std::bind_front(add, 1)(2) << std::endl;// C++23标准
// std::cout << std::bind_back(add, 2)(1) << std::endl;return 0;
}
- 为了给bind参数绑定需要引入命名空间中的using name std::placeholders占位符宏
- 通过_i来表示第几个参数,其中最明显的是一绿框和黑框中的
- 绿框:根据传入的占位符宏的编号索引到对应的值,_2表示取参数列表的第2个参数、依次类推
- 黑框:当参数列表为X个时,可以使用的宏为_i <= X,同时可以多个参数绑定同一个宏
- 和std::move一样可能现在对这个概念还不是很熟悉,等到完美转发forward的时候会更加清楚的理解bind和move
相关文章:
C++高级特性:柯里化过程与std::bind(六)
1、柯里化过程 1.1、operator()的引入 现在需要完成这样一个需求:有一个函数每次调用返回的结果不一样。例如:两次调用的返回值都不一样那么就可以达到这种目的 1.1.1、简单点的写法 可以给一个全局的变量(静态变量)ÿ…...
vmware虚拟机补救
更新了虚拟机里面工具和资料,进行了磁盘整理和压缩,虚拟机运行进不去系统了。 网站找的修复方法均不可行。补救措施:利用DiskGenius.exe(要用高版本不然复制的时候就知道了) DG1342.rar - 蓝奏云 加载虚拟硬盘 2008x…...
数据结构(算法)
总结,建议看EXCEL的《算法》页签,不然感觉有点乱 备注原理/步骤时间复杂度空间复杂度串的应用模式匹配简单/暴力O(mn) KMP O(mn) 树的应用树哈夫曼树1、带权路径长度WPL 2、外部排序-最佳归并树1、哈夫曼树的度,只有0和m(m叉…...
SpringCloud集成SkyWalking链路追踪并收集日志2
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
纯小白蓝桥杯备赛笔记--DAY4(数学数据结构图论)
文章目录 数学质因数分解辗转相除法求最大公约数最小公倍数:快速幂乘法逆元费马小定理 逆元乘法逆元素数判定与埃式筛法朴素素数判定法埃式筛法 图论并查集T3:真题--合根植物DijkstraFloyd 基础算法递归,循环,前缀和,差分STL 数学…...
python 最简单的网页爬虫
import requests url"https://news.ifeng.com/c/8OZc7eV01sM" rrequests.get(url) print(r.status_code) print(r.iter_lines()) # 获取响应的内容 content r.text# 打印网页内容 print(content) # responser.json() # print(response) 爬虫知识讲解: …...
二叉树-数据结构
二叉树-数据结构 二叉树是属性结构的一个重要类型。 如下图二叉树形状 二叉树特征如下: 1.二叉树由 n(n > 0) 个节点组成 2.如果 n 为 0,则为空树 3.如果 n 1,则只有一个节点称为根节点(root) 4.每个节点最多有两个节点,节…...
ansible使用shell模块的环境变量问题
在本机写了一个shell脚本,关于操作mysql的,在本机执行脚本可以正常操作数据库,脚本运行正常。 但是使用ansible ansible -i ./hosts test_teledb -m copy -a "src/etc/ansible/scripts/check.sh dest/tmp"ansible -i ./hosts test…...
ChatGPT论文写作指南:写出引人注目的论文
ChatGPT无限次数:点击直达 ChatGPT论文写作指南:写出引人注目的论文 作为一名有着10年经验的专业CSDN网站原创文章优质创作者,在当今的信息爆炸时代,论文写作的重要性愈发显现。如何能够写出引人注目的论文,吸引读者的眼球并获得…...
ARM64架构栈帧回溯
文章目录 前言一、栈帧简介二、demo演示 前言 请参考:ARM64架构栈帧以及帧指针FP 一、栈帧简介 假设下列函数调用: funb() {func() }funa() {funb() }main() {funa() }main函数,funa函数,funb函数都不是叶子函数,其…...
LangChain:大型语言模型(LLMs)-- 基础知识
1、LangChain的调用大型语言模型模块的介绍 LangChain是一个强大的框架,旨在通过调用大型语言模型(LLM)来开发各种语言驱动的应用程序。在LangChain中,LLM不仅仅是一个简单的模型调用,而是一个复杂链条中的关键部分。…...
总分410+专业130+国防科技大学831信号与系统考研经验国防科大电子信息与通信工程,真题,大纲,参考书。
好几个学弟催着,总结一下我自己的复习经历,希望大家复习少走弯路,投入的复习正比换回分数。我专业课831信号与系统130(感觉比估分要低,后面找Jenny老师讨论了自己拿不准的地方也没有错误,心里最近也这经常回…...
chatgpt Team 4.0共享合租账号的新方式
为了更好地满足工作需求,我订阅了GPT PLUS会员,但我发现,4.0每三小时问答40次经常吃灰,而且每月近200元的费用让我感到有点肉痛。 于是,我开始寻找有没有什么替代品。在逛某论坛的时候,发现了一个共享Team…...
类和对象二
一、运算符重载 为了使自定义类型可以使用加减等运算符,CPP提供了一个功能叫运算符重载。 关键字:operator操作符 运算符重载最好定义在类对象里,这也可以避免访问不到私有成员的问题。 代码演示: 在类里定义之后,…...
GD32 HID键盘矩阵键盘发送数据时,一直发送数据问题处理
这个问题找了两三天,开始并不认为是示例程序的问题,只是感觉是自己代码问题。 这个解决流程大概是: 先调好矩阵键盘=> 调用发送函数。 就是因为调用时,一直发送数据,我也在按键抬起做了操作,始终不行。 最后,发现时示例代码中有个 空闲中断 引起的。 udev->reg…...
小程序地理位置权限申请+uniapp调用uni.getLocation
文章目录 一、小程序地理位置权限申请二、uniapp调用uni.getLocation 一、小程序地理位置权限申请 需要确保小程序类目已经填写 点击左侧导航栏找到最后的“设置”——“基本设置”——“前往填写” 在开发管理——接口设置——地理位置中可以看到: 即可点击想要申…...
后台权限控制及动态路由
需求 后台系统需要能实现不同的用户权限可以看到不同的功能。 用户只能使用他的权限所允许使用的功能。 功能设计 之前在我的SpringSecurity的课程中就介绍过RBAC权限模型。没有学习过的可以去看下 RBAC权限模型 。这里我们就是在RBAC权限模型的基础上去实现这个功能。 表分…...
云计算:Linux 部署 OVS 集群(控制端)实现OpenFlow
目录 一、实验 1.环境 2.Linux 部署 OVS 集群(控制端) 3.控制端对接服务端OVS网元 4.服务端OVS添加流表 5.服务端删除OVS 二、问题 1. ODL如何查找已安装插件 2.查看流表显示不全 3.如何删除OVS流表 一、实验 1.环境 (1) 主机 表1 宿主机 主…...
使用/api/put保存数据到OpenTSDB,报204错误
错误信息 HttpResponseProxy{HTTP/1.1 204 No Content [Content-Type: application/json; charsetUTF-8, Content-Length: 0]} 错误原因 在OpenTSDB中,使用/api/put保执行写入操作,得到204响应,表示已经成功写入数据库。...
Open3D kmeans聚类(马氏距离,Python版本)
文章目录 一、简介二、算法步骤三、代码实现四、实现效果参考资料一、简介 在诸多的聚类方法中,K-Means聚类方法是属于“基于原型的聚类”(也称为原型聚类)的方法,此类方法均是假设聚类结构能通过一组原型刻画,在现实聚类中极为常用。通常情况下,该类算法会先对原型进行初始…...
python抠图程序
import cv2 import numpy as np def color_threshold(image, lower, upper): hsv_image cv2.cvtColor(image, cv2.COLOR_BGR2HSV) mask cv2.inRange(hsv_image, lower, upper) result cv2.bitwise_and(image, image, maskmask) return result # 读取图片…...
Android13 CameraServer启动流程
代码入口 frameworks/av/camera/cameraserver 里面包含了四个文件 我们先来看看Android.bp的内容 package {// See: http://go/android-license-faq// A large-scale-change added default_applicable_licenses to import// all of the license_kinds from "frameworks_a…...
如何升级node.js版本
升级Node.js可以通过多种方式来完成,以下是四种常见的方法: 方法一:使用Node.js官方安装程序 访问Node.js的官方网站,下载对应你操作系统的最新版本安装程序。通常,你可以 https://nodejs.org/en/download 找到你需…...
Excel---一个工作簿中的多个sheet合并成一个PDF
0 Preface/Foreword 1 操作方法 1.1 方法一 文件》 导出 》创建PDF/XPS 》 选项 》发布内容 》“整个工作簿” 1.2 方法二 文件》 打印》 打印机选项中,选择一种PDF阅读器 》设置选项中,选择打印整个工作簿。...
结合文本的目标检测:Open-GroundingDino训练自己的数据集
1、简单介绍 Open-GroundingDino是GroundingDino的第三方实现训练流程的代码,因为官方GroundingDino没有提供训练代码,只提供了demo推理代码。 关于GroundingDino的介绍可以看论文:https://arxiv.org/pdf/2303.05499.pdf GroundingDino的G…...
分布式锁-redission锁的MutiLock原理
5.5 分布式锁-redission锁的MutiLock原理 为了提高redis的可用性,我们会搭建集群或者主从,现在以主从为例 此时我们去写命令,写在主机上, 主机会将数据同步给从机,但是假设在主机还没有来得及把数据写入到从机去的时…...
MySQL索引、B+树相关知识汇总
MySQL索引、B树相关知识汇总 一、有一个查询需求,MySQL中有两个表,一个表1000W数据,另一个表只有几千数据,要做一个关联查询,如何优化?1、为关联字段建立索引二、小表驱动大表 二、b树和b树的区别1、更高的…...
相机模型浅析
相机模型 文章目录 相机模型四个坐标系针孔相机模型世界坐标系到相机坐标系相机坐标系到图像坐标系图像坐标到像素坐标 四个坐标系 ①世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标…...
国芯科技(C*Core)双芯片汽车安全气囊解决方案
汽车安全气囊是20世纪汽车上的十大发明之一,是目前汽车的法定标准配置,成为汽车驾乘人员生命安全的保护神。随着人们对汽车安全性要求的进一步提高,已形成前排驾驶员气囊、前排副驾驶员气囊、前排侧气囊、后排侧气囊、膝部气囊、安全气帘等等…...
牛客周赛 Round 39(A,B,C,D,E,F,G)
比赛链接 官方题解(视频) B题是个贪心。CD用同余最短路,预处理的完全背包,多重背包都能做,比较典型。E是个诈骗,暴力就完事了。F是个线段树。G是个分类大讨论,出题人钦定的本年度最佳最粪 题目…...
iis6.1的网站建设及权限设置/互联网下的网络营销
//阿里面试//2010 年,阿里正当红。那年 BAT 的名气还没有现今那么响亮。就业的时候,很多毕业生还是会选择 HP, IBM, EMC, SONY, ORACLE,Microsoft 等一类的外企。这些外企在毕业生眼中代表的是名牌,权威,以及自由&…...
杭州g20网站建设公司/获客
读书笔记-Effective Java(Lambda和Stream)42. Lambda优先于匿名类43.方法引用优先于Lambda44.坚持使用标准的函数接口45.谨慎使用Stream46.优先使用Stream中无副作用的函数47.Stream要优先用Collection作为返回类型48.谨慎使用Stream并行42. Lambda优先于…...
网站建设的相关职位/深圳创新创业大赛
我有位实业朋友特别推崇小米,因为小米崛起很快,销售额很大,估值很高、风投竞相涌入,小米既做研发又做制造又做电商也很成功、品牌塑造也很成功(有拥趸粉丝),而且小米做的是很重的(手…...
微视看视频领红包下载安装/优化品牌seo关键词
Java内部类的四种分类以及作用 总结: 内部类分别有成员内部类、静态内部类、局部内部类、匿名内部类。为什么使用内部类? 1、封装性,对访问权限做限制。 2、实现多继承,每个内部类可以继承一个父类。 3、解决继承及实现接口出现同…...
邳州做网站的公司/全能搜
题目给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。示例 1:输入: candidates…...
大学网站建设目标/百度联盟推广
ffmpeg.exe -i F:\闪客之家\闪客之歌.mp3 -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\11.flv ffmpeg -i F:\01.wmv -ab 56 -ar 22050 -b 500 -r 15 -s 320x240 f:\test.flv 使用-ss参数 作用(time_off set the start time offset),可以从指…...