C++11 bind
bind
bind 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函
数、静态函数、类静态函数甚至是类成员函数,参数包括普通参数和类成员。绑定后的
结果,可以使用 std::function 进行保存,并延迟调用到我们需要的时候。
绑定普通函数与参数及占位
bind 绑定顺序,也就是函数中形参的声明顺序。
placeholders::_x 中的序列是实参的顺序。
# if 1
//bind
#include <iostream>
#include <functional>using namespace std;double myDivide (double x, double y)
{return x/y;
}
int main(){auto myFunc = bind(myDivide, 10, 2);cout << myFunc() << endl;auto myFunc1 = bind(myDivide, 10,placeholders::_1);cout << myFunc1(2) << endl;//placeholders::_1 占位符,表示第一个参数,2表示第二个参数auto myFunc2 = bind(myDivide, placeholders::_2,placeholders::_1);cout << myFunc2(10,2) << endl;auto myFunc3 = bind(myDivide, placeholders::_1,placeholders::_2);cout << myFunc3(10,2) << endl;return 0;
}输出
5
5
0.2
5
# endif
绑定对象与成员及占位
绑定对象及成员函数时,顺序是调用成员,对象,[参数]。成员,对象及参数不能
有缺位,缺位可用 placeholders::_x 来占位。否则编译不过。
// todo 类成员函数绑定#include <iostream>
#include <functional>
using namespace std;
struct A{int x;double y;
};class B{
public:
// void func(){
// cout << "B::func()" << endl;
// }void func(int x,int y){cout << "void func(int x,int y)" << endl;cout << "x=" << x << " y=" << y << endl;}};
int main() {A a={1,2.5};// 绑定到对象a的成员变量xauto f = bind(&A::x, a); // 绑定到对象a的成员变量xcout << f() << endl; // 输出1//B b;//auto f1 = bind(&B::func, b); // 绑定到对象b的成员函数func//f1(); // 输出B::func()//// B b1;// auto f2 = bind(&B::func, b1,10,20); // 绑定到对象b的成员函数func// f2(); // 输出void func(int x,int y) x=10 y=20B b1;auto f2 = bind(&B::func, b1,placeholders::_1,placeholders::_2); // 绑定到对象b的成员函数funcf2(3,4);return 0;
}
函数重载情形下的绑定
#include <iostream>
#include <functional>
using namespace std;int add(int x, int y)
{cout<<"int add(int x, int y)"<<endl;return x + y;
}double add(double x, double y)
{cout<<"double add(double x, double y)"<<endl;return x + y;
}class MyPair
{
public:int add(int x, int y){cout<<"MyPair:: int add(int x, int y)"<<endl;return x + y;}double add(double x, double y){cout<<"MyPair:: double add(double x, double y)"<<endl;return x + y;}
};int main(){auto f1= bind( (int (*)(int x, int y))add, 1, 2);f1(); // 输出 int add(int x, int y)auto f2= bind( (double (*)(double x, double y))add, 1, 2);f2(); // 输出 double add(double x, double y)MyPair p;auto f3= bind( (int (MyPair::*)(int x, int y))&MyPair::add, p, 1, 2);f3(); // 输出 MyPair:: int add(int x, int y)MyPair p1;auto f4= bind( (double (MyPair::*)(double x, double y))&MyPair::add, p1, placeholders::_1, placeholders::_2);f4(2,3); // 输出 MyPair:: double add(double x, double y)return 0;
}
bind 语义
语义小结
(1)bind 预先绑定的参数需要传具体的变量或值进去,对于预先绑定的参数,是pass-by-value 的。(2)对于不事先绑定的参数,需要传 std::placeholders 进去,从_1 开始,依次
递增。placeholder 是 pass-by-reference 的。(3)bind 的返回值是可调用实体,可以直接赋给 std::function 对象。(4)对于绑定的指针、引用类型的参数,使用者需要保证在可调用实体调用之前,
这些参数是可用的。(5)类的 this 可以通过对象或者指针来绑定。
多态之 bind +fucntion
function 本是不可以包装类成员函数,但是 bind 的可以实现类成员函数的绑定,
然后赋给 fucntion 对象,亦即实现了间接性的包装。
//todo bind + function
#include <iostream>
#include <functional>
using namespace std;void foo()
{cout<<"void foo()"<<endl;
}
void func(int a)
{cout<<"void func(int a)"<<endl;
}class Foo
{
public:void method(){cout<<"Foo::void method()"<<endl;}void method2(string s){cout<<"Foo:void method2()"<<endl;}
};class Bar
{
public:void method3(int a ,string s){cout<<"Bar:void method3()"<<endl;}
};std::function<void(void)> f;int main()
{f=foo;f(); // 输出 void foo()f= bind(func,10);f(); // 输出 void func(int a)Foo foo;f= bind(&Foo::method,foo);f(); // 输出 Foo::void method()f = bind(&Foo::method2,foo,"hello");f(); // 输出 Foo:void method2()Bar bar;f= bind(&Bar::method3,bar,1,"world");f(); // 输出 Bar:void method3()return 0;
}
相关文章:
C++11 bind
bind bind 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函 数、静态函数、类静态函数甚至是类成员函数,参数包括普通参数和类成员。绑定后的 结果,可以使用 std::function 进行保存,并延迟调用到我们需要的时候。 绑…...
LeetCode199 二叉树的右视图
前言 题目: 199. 二叉树的右视图 文档: 代码随想录——二叉树的右视图 编程语言: C 解题状态: 成功解决! 思路 二叉树层序遍历问题的变种,右视图即意味着二叉树每层的最后一个节点。 代码 /*** Definiti…...
数据赋能(172)——开发:数据挖掘——影响因素、直接作用、主要特征
影响因素 主要影响因素如下: 数据类型与属性: 数据类型和对象的不同属性会使用不同的数据类型来描述,如年龄可能是整数类型,而生日则是日期类型。数据挖掘时需要对不同的数据类型进行不同的处理,这直接影响到挖掘算法…...

Vue:Vue3-TypeScript-Pinia-Vite-pnpm / 基础项目 / 20240807
一、项目技术栈 / 依赖 序号技术栈版本解释1node20.14.02vue 3.4.31 3vite 5.3.4 4TypeScript 5.2.2 5 types/node 22.0.2 解决TypeScript项目中缺少对应模块的类型定义文件的问题6 element-plus 2.7.8 ui组建7 types/js-cookie js-cookie 3.0.6 3.0.5 8 sass 1.77.8 9 hu…...
windows Qt 录屏 录音
启动录屏录音: connect(&m_Process, &QProcess::readyReadStandardOutput, [&]() {qDebug() << "Standard output:" << QString::fromLocal8Bit(m_Process.readAllStandardOutput()); });connect(&m_Process, &QProcess…...

AAC中的ADTS格式分析
😎 作者介绍:欢迎来到我的主页👈,我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun(领取大厂面经等资料),欢迎加我的…...

iOS内存管理---MRC vs ARC
系列文章目录 iOS基础—Block iOS基础—Protocol iOS基础—KVC vs KVO iOS网络—AFNetworking iOS网络—NSURLSession iOS内存管理—MRC vs ARC iOS基础—Category vs Extension iOS基础—多线程:GCD、NSThread、NSOperation iOS基础—常用三方库:Mason…...

【数学分析笔记】第1章第1节:集合(2)
这节我自己补了一些内容,要不然听不太懂陈纪修老师讲的 1. 集合与映射 1.3 子集与真子集 假如有 S \textbf{S} S和 T \textbf{T} T两个集合,其中, S \textbf{S} S的所有元素都属于 T \textbf{T} T,则称 S \textbf{S} S是 T \te…...

大话设计模式:七大设计原则
目录 一、单一职责原则(Single Responsibility Principle, SRP) 二、开放封闭原则(Open-Closed Principle, OCP) 三、依赖倒置原则(Dependency Inversion Principle, DIP) 四、里氏替换原则&am…...

利用多商家AI智能名片小程序提升消费者参与度与个性化体验:重塑零售行业的忠诚策略
摘要:在数字化浪潮席卷全球的今天,零售行业正经历着前所未有的变革。消费者对于购物体验的需求日益多样化、个性化,而零售商则面临着如何将一次性购物者转化为品牌忠诚者的巨大挑战。多商家AI智能名片小程序作为一种新兴的数字营销工具&#…...
Scala 闭包
Scala 闭包 Scala 闭包是一个非常重要的概念,它允许我们创建可以在稍后某个时间点执行的功能片段。闭包是一个函数,它捕获了封闭范围内的变量,即使在函数外部,这些变量也可以在函数内部使用。这使得闭包成为处理异步操作、回调和…...
前端JS总结(中)
目录 前言 正文 对象: 分类: 自定义对象: 内置对象: 重点: 常用内置对象: 字符串对象:String 获取字符串长度: 大小写转换: 获取某个字符: 截取字…...

elasticsearch的match_phrase匹配及其可能导致的查询问题
目录 1.match_phrase使用介绍 2.规避可能产生的查询问题 解决方式 一.查询和索引分词器一致,即都使用max_word或者都使用smart 二.使用slop增加匹配的容忍度 3.参考文档 1.match_phrase使用介绍 elasticsearch的match_phrase查询是全文查询,主要用…...

C++快速理解之继承
一、继承和派生 1.是什么? C 中的继承是类与类之间的关系,与现实世界中的继承类似 例如:儿子继承父亲的财产 继承(Inheritance)可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如: 类B继承…...

Node.JS - 基础(Express)
目录 A. 简介 B. 下载,安装 C. 启动服务,查看文件结构 A. 简介 Express 是一个基于 Node.js 平台的极简、灵活的 Web 应用开发框架,它提供了一系列强大的功能来构建 Web 应用程序和 API。 一、Express 的基本特点 简洁的路由系统: Express 的路由系…...

I/O复用
I/O复用使得程序能够同时监听多个文件描述符,这对提高程序的性能至关重要。 举个例子: 就好比你天天玩手机,你妈为了监控你,在你房间安装了一个监控,这个监控可以实时监控你的一举一动,并上传到你妈手机上…...

【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题
目录 背景一. 报错信息1.1 报错的图片信息1.2 报错的文字信息 二. 解决报错2.1 下载 NetFx3.cab 文件2.2 执行命令 三. SQL Server 修复安装 背景 一次在阿里云服务器安装 SQL Server 2012时,系统报错了,导致安装进行不下去…通过在网上查找了多种解决方…...

STM32的SDIO接口详解
目录 1. 定义与兼容性 2. SDIO时钟 3. SDIO命令与响应 4. SDIO块数据传输 5. SDIO控制器的硬件结构 6.代码实现 1.SD初始化 2.测试SD卡的读取 3.测试SD卡的写入 STM32的SDIO(Secure Digital Input/Output,安全数字输入输出)接口是一…...

docker容器常用指令,dockerfile
docker:容器,主要是解决环境迁移的问题,将环境放入docker中,打包成镜像。 docker的基本组成:镜像(image),容器(container),仓库(repository)。镜像相当于类,容器相当于类的实例对象…...

C语言学习笔记 Day11(指针--下)
Day11 内容梳理: 目录 Chapter 7 指针 7.6 指针 & 函数 (1)形参改变实参的值 (2)字符数组作为函数参数 1)合并字符串 2)删掉字符串中空格 (3)指针作为函数返…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

uni-app学习笔记三十五--扩展组件的安装和使用
由于内置组件不能满足日常开发需要,uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件,需要安装才能使用。 一、安装扩展插件 安装方法: 1.访问uniapp官方文档组件部分:组件使用的入门教程 | uni-app官网 点击左侧…...