C++11(六)----包装器function和bind

文章目录

    • 包装器:function
    • 包装器:bind

包装器:function

  • function接口介绍

    在头文件<functional>
    在这里插入图片描述

  • 语法:function的语法比较特殊
    function<返回值(参数)> 自定义变量名 = 要被包装的可调用对象

    • class Plus
      {
      public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a + b;}
      };
      
    • 包装静态成员函数:对调用的函数指定类域即可

      int main()
      {// 类的静态成员函数std::function<int(int, int)> func4 = &Plus::plusi;cout << func4(1, 2) << endl;
      }
      
    • 包装非静态成员函数:要对调用的函数指定类域,且在类域前加上取地址符号。且非静态成员函数包含了一个隐藏的this指针。因此参数类型还要加上this指针,加上该类类型的指针/该类类型本身

      int main()
      {// 类的非静态成员函数std::function<double(Plus*, double, double)> func5 = &Plus::plusd;std::function<double(Plus, double, double)> func6 = &Plus::plusd;
      }
      
      • 为什么非静态成员中是有一个隐藏的this指针,但是加上的参数类型可以为该类类型的指针也可以为该类的类类型呢?
        这是因为在底层上 包装器 实际上是通过operator()中的一系列操作后找到 该非静态成员函数 然后调用该非静态成员类型函数。而要找到该非静态成员函数 就需要 该类类型的指针/该类类型。
  • function的作用
    包装任意的可调用对象

  • 目前学到的对象:函数指针;仿函数;lambda表达式

  • 样例

     #include <functional>
    int f(int a, int b)
    {return a + b;
    }
    struct Functor
    {
    public:int operator() (int a, int b){return a + b;}
    };
    class Plus
    {
    public:static int plusi(int a, int b){return a + b;}double plusd(double a, double b){return a + b;}
    };int main()
    {// 函数名(函数指针)std::function<int(int, int)> func1 = f;cout << func1(1, 2) << endl;// 函数对象std::function<int(int, int)> func2 = Functor();cout << func2(1, 2) << endl;// lamber表达式std::function<int(int, int)> func3 = [](const int a, const int b)	{return a + b; };cout << func3(1, 2) << endl;// 类的成员函数std::function<int(int, int)> func4 = &Plus::plusi;cout << func4(1, 2) << endl;std::function<double(Plus, double, double)> func5 = &Plus::plusd;cout << func5(Plus(), 1.1, 2.2) << endl;return 0;
    }
    

    其他应用场景之一:150. 逆波兰表达式求值 - 力扣(LeetCode)
    题解

    class Solution {
    public:int evalRPN(vector<string>& tokens) {stack<int> st;map<string,function<int(int,int)>> opFunc={{"+",[](int x, int y){return x + y;}},{"-",[](int x, int y){return x - y;}},{"*",[](int x, int y){return x * y;}},{"/",[](int x, int y){return x / y;}},};int ret = stoi(tokens[0]);for(auto& e : tokens){if(opFunc.count(e)){int right = st.top();st.pop();int left = st.top();st.pop();ret = opFunc[e](left,right);st.push(ret);}else{st.push(stoi(e));}}return ret;}
    };
    

包装器:bind

bind也称为 “绑定”,可以改变函数参数的顺序
std::bind函数定义在头文件中,是一个函数模板,它就像一个函数包装器(适配器),接受一个可 调用对象(callable object),生成一个新的可调用对象来“适应”原对象的参数列表。
一般而 言,我们用它可以把一个原本接收N个参数的函数fn,通过绑定一些参数,返回一个接收M个(M 可以大于N,但这么做没什么意义)参数的新函数。
同时,使用std::bind函数还可以实现参数顺 序调整等操作。

  • bind接口介绍
    在这里插入图片描述

    • 第一个参数是可调用对象

    • 第二个参数是 placeholders 命名空间的标识符
      在这里插入图片描述

      该命名空间的第一个标识符_1表示函数的第一个参数,_2表示函数的第二个参数,_3代表函数的第三个参数,依次类推

  • 语法
    bind的返回值也只能通过auto来推导

  • 样例

    • using placeholders::_1;
      using placeholders::_2;
      using placeholders::_3;int Sub(int a, int b)
      {return (a - b) * 10;
      }int SubX(int a, int b, int c)
      {return (a - b - c) * 10;
      }
      
    • 基本语法

      	auto sub = bind(Sub,_1,_2);cout << sub(10,5) << endl;
      
    • 调整参数顺序

      // bind 本质返回的一个仿函数对象// 调整参数顺序(不常用)// _1代表第一个实参// _2代表第二个实参// ...auto sub2 = bind(Sub, _2, _1);cout << sub2(10, 5) << endl;
    • 调整参数个数

      	// 调整参数个数 (常用)auto sub3 = bind(Sub, 100, _1);cout << sub3(5) << endl;auto sub4 = bind(Sub, _1, 100);cout << sub4(5) << endl;// 分别绑死第1,2,3个参数auto sub5 = bind(SubX, 100, _1, _2);cout << sub5(5, 1) << endl;auto sub6 = bind(SubX, _1, 100, _2);cout << sub6(5, 1) << endl;auto sub7 = bind(SubX, _1, _2, 100);cout << sub7(5, 1) << endl;
      
  • 绑定bind一般用于,一般固定绑死的参数。例如:function调用非静态成员函数时的类类型的指针/类类型。 绑死利率等等也是应用场景

    // bind一般用于,绑死一些固定参数function<double(double, double)> f7 = bind(&Plus::plusd, Plus(), _1, _2);cout << f7(1.1, 1.1) << endl;//auto func1 = [](double rate, double monty, int year)->double {return monty * rate * year;};auto func1 = [](double rate, double monty, int year)->double {double ret = monty;for (int i = 0; i < year; i++){ret += ret * rate;}return ret - monty;};//绑死利率//3年期0.015利率function<double(double)> func3_1_5 = bind(func1, 0.015, _1, 3);//5年期0.015利率function<double(double)> func5_1_5 = bind(func1, 0.015, _1, 5);//10年期0.025利率function<double(double)> func10_2_5 = bind(func1, 0.025, _1, 10);//10年期0.035利率function<double(double)> func20_3_5 = bind(func1, 0.035, _1, 30);//输入 存储的钱 , 输出 利息产生的钱cout << func3_1_5(1000000) << endl;cout << func5_1_5(1000000) << endl;cout << func10_2_5(1000000) << endl;cout << func20_3_5(1000000) << endl;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

店铺推推-项目测试用例设计(Xmind)

项目介绍&#xff1a; 技术栈: Spring BootMyBatisRedis项目描述&#xff1a; 项目旨在为消费者提供一个公平、公开、透明的平台&#xff0c;让消费者能够基于真实的消费体验对店铺进行评价和 推荐&#xff0c;并为其他潜在消费者提供参考。同时&#xff0c;店铺推推也是为商家…

c++--------《set 和 map》

c--------《set 和 map》 1 set系列的使⽤1.1 set类的介绍1.2 set的构造和迭代器1.3 set重要接口 2 实现样例2.1: insert和迭代器遍历使⽤样例&#xff1a;2.2: find和erase使⽤样例&#xff1a; 练习3.map系列的使用3.1 map类的介绍3.1.1 pair类型介绍 3.2 map的数据修改3.3mu…

GIS融合之路(八)-如何用Cesium直接加载OSGB文件(不用转换成3dtiles)

系列传送门&#xff1a; 山海鲸可视化&#xff1a;GIS融合之路&#xff08;一&#xff09;技术选型CesiumJS/loaders.gl/iTowns? 山海鲸可视化&#xff1a;GIS融合之路&#xff08;二&#xff09;CesiumJS和ThreeJS深度缓冲区整合 山海鲸可视化&#xff1a;GIS融合之路&…

cooper+隐含数+2元cooper

发现群里一个题&#xff0c;应该是几天前一个比赛的。作了一下午。 from Crypto.Util.number import * import os from hashlib import * from random import * p getPrime(512) q getPrime(512) n p*q m bytes_to_long(os.urandom(20)) x pow(m,p,n) y pow(m,q,n)with…

QQ 小程序已发布,但无法被搜索的解决方案

前言 我的 QQ 小程序在 2024 年 8 月就已经审核通过&#xff0c;上架后却一直无法被搜索到。打开后&#xff0c;再在 QQ 上下拉查看 “最近使用”&#xff0c;发现他出现一下又马上消失。 上线是按正常流程走的&#xff0c;开发、备案、审核&#xff0c;没有任何违规&#xf…

word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行

注&#xff1a;本文为 “word 中长公式换行 / 对齐 | Mathtype 中长公式换行拆分 | latex 中长公式换行” 相关专题文章合辑。 未整理去重。 “公式较长时最好在等号 “&#xff1d;” 处转行&#xff0c;如难实现&#xff0c;则可在&#xff0b;、&#xff0d;、、 运算符号处…

【优选算法 — 滑动窗口】串联所有单词的子串 最小覆盖子串

串联所有单词的子串 串联所有单词的子串 题目描述 题目解析 算法原理 以示例一为例&#xff0c;一定要记得&#xff0c;words中的每一个字符串长度相同&#xff0c;所以我们可以根据 words 中的每一个字符串的长度length&#xff0c;将 s 这个字符串以 length 个为一组来…

了解 Solon MVC 的参数注入规则

关于 Solon MVC 参数注入&#xff0c;主要尊守以下基本规则&#xff1a; 参数名与请求数据名一一对应。当对上不上时&#xff0c;会采用整体数据注入&#xff08;如果接收的是实体&#xff09;参数名与请求数据同名时&#xff0c;又想整体注入&#xff08;如果接收的是实体&am…

[SpB]如何开始使用 Spring Boot?

如何开始使用 Spring Boot&#xff1f; Spring Boot 简化了 Java 项目开发&#xff0c;你只需要专注于业务逻辑&#xff0c;底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤&#xff0c;以及如何通过 IDEA 了解 Spring Boot 的功能…

vue如何实现组件切换

一、使用条件渲染 (v-if) <template><div><button click"currentView ComponentA">Show Component A</button><button click"currentView ComponentB">Show Component B</button><component-a v-if"curren…

WEB攻防-通用漏洞SQL注入sqlmapOracleMongodbDB2等

SQL注入课程体系&#xff1a; 1、数据库注入-access mysql mssql oracle mongodb postgresql 2、数据类型注入-数字型 字符型 搜索型 加密型&#xff08;base64 json等&#xff09; 3、提交方式注入-get post cookie http头等 4、查询方式注入-查询 增加 删除 更新 堆叠等 …

7.揭秘C语言输入输出内幕:printf与scanf的深度剖析

揭秘C语言输入输出内幕&#xff1a;printf与scanf的深度剖析 C语言往期系列文章目录 往期回顾&#xff1a; VS 2022 社区版C语言的安装教程&#xff0c;不要再卡在下载0B/s啦C语言入门&#xff1a;解锁基础概念&#xff0c;动手实现首个C程序C语言概念之旅&#xff1a;解锁关…

SHELL(4)脚本与用户交互以及if条件判断

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

部分利用oracle数据字典查询对应信息的语句。

查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * from user_role_privs; 查看当前用户的系统权限和表级权限 SQL>select * from user_sys_privs; SQL>select * from user_tab_privs; …

#Ts篇: ts学习再梳理

ts类型梳理 类型声明的写法&#xff0c;一律为在标识符后面添加“冒号 类型”。函数参数和返回值&#xff0c;也是这样来声明类型。 function toString(num: number): string {return String(num); }上面示例中&#xff0c;函数toString()的参数num的类型是number。参数列表…

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…

定时器的小应用

第一个项目 第一步&#xff0c;RCC开启时钟&#xff0c;这个基本上每个代码都是第一步&#xff0c;不用多想&#xff0c;在这里打开时钟后&#xff0c;定时器的基准时钟和整个外设的工作时钟就都会同时打开了 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);第二步&…

【工控】线扫相机小结 第三篇

海康软件更新 目前使用的是 MVS_STD_4.3.2_240705.exe &#xff0c;最新的已经到4.4了。 一个大的变动 在上一篇中我们提到一个问题&#xff1a; 需要注意的是&#xff0c;我们必须先设置 TriggerSelector 是 “FrameBurstStart” 还是 “LineStart” 再设置TriggerMode 是 …

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…