【C++11】 包装器 | bind

news2024/11/14 3:04:14

文章目录

  • 1. 包装器
    • 概念理解
    • 用法
    • 成员函数的包装
      • 静态成员函数
      • 非静态成员函数
  • 2. bind
    • 概念理解
    • 功能1 调整参数顺序 (用处不大)
    • 功能2 调整参数个数

1. 包装器

概念理解

function包装器 也被叫做 适配器
C++11中function本质是类模板,也是一个包装器

意义在于 对可调用对象类型进行封装再适配

可调用对象:函数指针 / lambda / 仿函数


用法

需要包含 头文件 functional

模板参数
Ret : 被调用函数的返回类型
…Args作为参数包,这个参数包中包含0到任意个模板参数
Args… :被调用函数的形参


f作为函数指针,Functor作为一个类 ,两者类型是完全不同的,
想要声明出统一的类型,就需要借助包装器进行包装,从而适配出统一的可调用对象的类型

function<int(int,int)>
第一个int作为返回值 小括号中的两个int参数,作为被调用函数的参数
此时既可以使用函数指针进行初始化,也可以使用仿函数进行初始化


对于产生的包装器对象v1和v2,两者的类型是相同
但在调用时,一个调用的是f函数,一个调用的是Functor中的operator()


包装器作为map的第二个参数
包装器的返回值为int类型,被调用函数有两个int的参数
可以将 f (函数指针) 、 Functor (仿函数)、 lambda表达式 作为可调用对象 传给包装器 ,对包装器进行初始化

成员函数的包装

成员函数中分为静态成员函数和非静态成员函数

静态成员函数

对于静态成员函数,可以直接使用包装器 function
通过Plus这个类去寻找到plusi 这个函数 ,对包装器 进行初始化即可

非静态成员函数

对于普通成员函数,是没办法直接使用 function包装器的
普通成员函数在类中有 this指针存在, 所以要在main函数中要加入 Plus


这里不是直接去调用plusd这个函数的, 而是通过Plus对象去调用 plusd


这里不是直接去调用plusd这个函数的, 而是通过指针去调用 plusd
若为plus*,则匿名对象是需要取地址的
而匿名对象属于右值,不能取地址 ,
所以使用Plus*,不能使用匿名对象


最后加入&后, 即可解决 问题 (加&是规定)

2. bind

概念理解

bind函数 定义在头文件中,是一个函数模板

bind函数可以看作一个通用的函数适配器,它接受一个可调用对象(函数指针 仿函数 lambda对象)
生成一个新的可调用对象来 适应 原对象的参数列表


调用bind的一般形式:auto newCallable = bind(callable,arg_list);

arg_list中的参数可能包含形如_n的名字,其中n是一个整数,这些参数是占位符,
_1表示第一个参数,_2表示第二个参数 ,但默认情况下获取不到 (_1 和_2被放到命名空间中)

绑定的参数被放到 placeholders


placeholders 命名空间中,有_1 _2 _3等 符号存在
所以想使用_1表示第一个参数 ,需在placeholders命名空间中访问_1 即 placehlders::_1

功能1 调整参数顺序 (用处不大)

正常情况下,把1传给参数a,把2传给参数b ,打印a=1 b=2


若想把1传给参数b,把2传给参数a ,则使用bind

bind的第一个参数为可调用对象
bind的参数包作为占位符,借助placeholders 命名空间 来访问里面的字符(_1 _2)

把Sub1函数中的第二个参数2传给Sub函数的a
把Sub1函数中的第一个参数1传给Sub函数的b

绑定后 会返回一个可调用对象, 可以选择使用auto 自动推导类型
再通过返回的对象,再次调用1 2 ,则结果不同


功能2 调整参数个数

在Sub类中的 func函数,虽然看似只有两个参数,但是还有一个隐藏的this指针存在


若使用包装器,则需三个参数,通过匿名对象去调用func函数


function中的参数个数与 func的参数个数 不同
若想两者参数个数相同,则需要绑定,进行调整参数的个数

bind可以把某个参数绑死 (把其中一个参数显示传过去)

在这里插入图片描述
把匿名对象显示传过去,此时匿名对象就绑死了
placehlders::_1和 placehlders::_2 表示剩下的两个参数
可调用对象 只需 传递两个参数 即可

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

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

相关文章

LeetCode-69. x 的平方根

LeetCode-69. x 的平方根 1、题目描述2、解题思路3、代码实现4、解题记录 ) 1、题目描述 题目描述&#xff1a; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 示例1&a…

【裸机开发】I2C 通信接口(二)—— I2C 寄存器解析

目录 一、硬件原理图分析 二、IO 复用寄存器解析 三、I2C 寄存器解析 3.1 时钟配置 3.2 I2C1_IADR&#xff08;设置从机地址&#xff09; 3.3 I2C1_IFDR&#xff08;设置分频值&#xff09; 3.4 I2C1_I2CR&#xff08;I2C使能、中断控制&#xff09; 3.5 I2C1_I2SR…

不知道校园跑腿项目如何运营?那就先看看这份运营指导方案!

当大学生在校创业&#xff0c;其实并不与课业学习矛盾。相反&#xff0c;大学生可以抓住校园市场&#xff0c;利用校园这一具有自然地理优势的封闭市场&#xff0c;深入培育师生客户的需求&#xff0c;进入校园市场的蓝海&#xff0c;在不耽误学习的情况下有一个良好的收入来源…

AIGC-midjourney系列1-制作自己的证件照,卡通照

1 账号 淘宝购买共享账户 2 新建服务器 3 添加midjourney机器人 4 添加insightface机器人 在服务器聊天框输入并发送 https://discord.com/oauth2/authorize?client_id1090660574196674713&permissions274877945856&scopebot点击链接 5 insightface使用 使用…

cf 比赛 03

2021.04.28 训练地址 B. Bananas in a Microwave 题意&#xff1a;一开始的时候手里的数是0 这个题一开始想复杂了. 其实很简单. 我们想一个性质&#xff0c;我们用背包dp做这个题&#xff0c;从大到小枚举体积 j. 然后状态转移是从前往后推&#xff08;不是之前的那个找前驱…

记录 windows11 qemu安装 麒麟操作系统的经历

因为本人供职的公司&#xff0c;要求国产化环境很多的软件&#xff0c;同时为了方便docker部署&#xff0c; 所以开启了 qemu虚拟aarch64环境的经历&#xff0c;用的软件如下&#xff1a; 有需要的私信&#xff0c;存在了&#xff0c;阿里云盘&#xff0c;百度云盘没有会员就是…

大厂面试测试岗,你一个很小的错误就能让你被淘汰

背景介绍 前后参加过几家互联网公司的测试开发岗位面试&#xff0c;其中两次百度的面试&#xff0c;一次止步三面&#xff0c;另一次止步于四面。这里就主要总结一下百度的面试经历和心得体会。总体感觉百度的面试官比较注重基础&#xff0c;问题不难但是覆盖范围比较全面。相…

栈,栈帧Stack Frames和函数调用过程Control Flow

栈其实就是计算机系统内存中的一小块。栈是一块特殊的内存区域&#xff0c;栈在内存中的增长方向是向低地址扩展&#xff0c;%rsp寄存器存储栈的最低地址&#xff0c;即栈顶元素的地址。这种栈结构在程序中的应用有助于实现函数调用、局部变量的管理以及递归等功能。 Push和Pop…

Blazor 自定义可重用基础组件之 CheckBox

Blazor 原生提供的基础组件实在是一言难尽&#xff0c;这给许多Blazor UI公司很多机会。可是试用了不少如AntDisgen、BootstrapBlazor等&#xff0c;总会有一些难尽如意的地方。还是自己做丰衣足食吧。 首先是带Label的CheckBox&#xff0c;代码如下&#xff1a; <p><…

HTML5开发工程师岗位的职责说明文(合集)

HTML5开发工程师岗位的职责说明文1 职责&#xff1a; 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5&#xff0c;Javascript相关技术实现web端的界面效果、交互和功能; 2、基于HTML5.0的标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、负责分析和解决前端…

30多个小程序一键发布——miniprogram-ci

概述 miniprogram-ci 是从微信开发者工具中抽离的关于小程序/小游戏项目代码的编译模块。 开发者可不打开小程序开发者工具&#xff0c;独立使用 miniprogram-ci 进行小程序代码的上传、预览等操作。 miniprogram-ci 从 1.0.28 开始支持第三方平台开发的上传和预览&#xff0…

[DBT-05509] Failed to connect to the specified database (orcl).

同事在arm上测试19c部署时&#xff0c;发截图给我说dbca建库有告警&#xff0c;无法进行&#xff0c; Cause- OS Authentication might be disabled for this database (orcl). Action Specify a valid sysdba user name and password to connect to the database. 查找到的…

Windows安装ciphey编码工具,编码工具战神,cry简单题绝对克星!

TA是什么 一款智能化的编码分析解码工具&#xff0c;对于CTF中复杂性编码类题目可以快速攻破。 编码自动分析解码的神器。 如何安装 Windows环境 Python 3.8 64位&#xff08;最新的版本不兼容&#xff0c;32位的也不行&#xff09; 方便起见&#xff0c;我直接给一个3.8.…

【花雕】全国青少年机器人技术一级考试备考实操搭建手册2

目录 1、秋千 2、跷跷板 3、搅拌器 4、奇怪的钟 5、起重机 6、烤肉架 7、手摇风扇 8、履带车 9、直升机 10、后轮驱动车 游乐场里的跷跷板 跷跷板&#xff08;又作翘翘板&#xff09;&#xff0c;又称为摇摇板&#xff0c;是指以某些东西作为支点&#xff0c;支撑著很长但十分…

MongoDB 获取数组中匹配到的第一个元素对象

例如当前test库中的grade集合中有两条文档数据,如下图所示: 相关的两个实体映射类如下: import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb…

Python中Self的详解及使用

大家学Python面向对象的时候&#xff0c;总会遇到一个让人难以理解的存在&#xff1a;self 这个self到底是谁啊&#xff0c;为什么每个类实例方法都有一个参数self&#xff0c;它到底有什么作用呢&#xff1f; 「先下结论&#xff1a;类实例化后&#xff0c;self即代表着实例&…

[SSM]在WEB中应用MyBtis

目录 MyBatis基础 5.1需求描述 5.2数据库表的设计和准备数据 5.3实现步骤 第一步&#xff1a;引入相关依赖 第二步&#xff1a;引入相关配置文件&#xff0c;放到resources目录下&#xff08;全部放到类的根路径下&#xff09; 第三步&#xff1a;前端页面index.html 第…

Istio 深入理解数据平面组件 Envoy

ingress control承载了控制面和数据面的一个职责&#xff0c;在control里面有一个process&#xff0c;这个进程就承担了反向代理的能力&#xff0c;当有任何请求发过来的时候&#xff0c;会被nginx接收到这个请求并且被转发&#xff0c;基于的规则由ingress control动态配置的&…

2023年7月1日【青书学堂】考试 计算机应用基础(高起专)

2023年7月1日【青书学堂】考试 计算机应用基础(高起专) 注意:答案仅供参考 成绩:88.8 分 第1题 单选题 在Word的编辑状态,按先后顺序依次打开了d1.doC、d2.doC、d3.doC、d4.doc 4个文档,当前的活动窗口的文档名为____。 A:d1.doc B:d2.doc C:d4.doc D:d3.doc 答案:C 第…

php代码还原工具,解决goto语句混淆,php goto解密还原

在编写php代码时&#xff0c;使用goto语句是一种常见的加密技巧。为了解决goto解码无法阅读这个问题&#xff0c;今天我要向大家介绍一款强大的php goto解密工具。 这款工具的主要功能之一就是php代码的还原。通过对代码进行解析和分析&#xff0c;它能够轻松还原被混淆的goto…