当前位置: 首页 > news >正文

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 用来将可调用对象和参数一起进行绑定。可调用对象包括普通函数、全局函 数、静态函数、类静态函数甚至是类成员函数&#xff0c;参数包括普通参数和类成员。绑定后的 结果&#xff0c;可以使用 std::function 进行保存&#xff0c;并延迟调用到我们需要的时候。 绑…...

LeetCode199 二叉树的右视图

前言 题目&#xff1a; 199. 二叉树的右视图 文档&#xff1a; 代码随想录——二叉树的右视图 编程语言&#xff1a; C 解题状态&#xff1a; 成功解决&#xff01; 思路 二叉树层序遍历问题的变种&#xff0c;右视图即意味着二叉树每层的最后一个节点。 代码 /*** Definiti…...

数据赋能(172)——开发:数据挖掘——影响因素、直接作用、主要特征

影响因素 主要影响因素如下&#xff1a; 数据类型与属性&#xff1a; 数据类型和对象的不同属性会使用不同的数据类型来描述&#xff0c;如年龄可能是整数类型&#xff0c;而生日则是日期类型。数据挖掘时需要对不同的数据类型进行不同的处理&#xff0c;这直接影响到挖掘算法…...

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 录屏 录音

启动录屏录音&#xff1a; connect(&m_Process, &QProcess::readyReadStandardOutput, [&]() {qDebug() << "Standard output:" << QString::fromLocal8Bit(m_Process.readAllStandardOutput()); });connect(&m_Process, &QProcess…...

AAC中的ADTS格式分析

&#x1f60e; 作者介绍&#xff1a;欢迎来到我的主页&#x1f448;&#xff0c;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff08;领取大厂面经等资料&#xff09;&#xff0c;欢迎加我的…...

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基础—多线程&#xff1a;GCD、NSThread、NSOperation iOS基础—常用三方库&#xff1a;Mason…...

【数学分析笔记】第1章第1节:集合(2)

这节我自己补了一些内容&#xff0c;要不然听不太懂陈纪修老师讲的 1. 集合与映射 1.3 子集与真子集 假如有 S \textbf{S} S和 T \textbf{T} T两个集合&#xff0c;其中&#xff0c; S \textbf{S} S的所有元素都属于 T \textbf{T} T&#xff0c;则称 S \textbf{S} S是 T \te…...

大话设计模式:七大设计原则

目录 一、单一职责原则&#xff08;‌Single Responsibility Principle, SRP&#xff09;‌ 二、开放封闭原则&#xff08;‌Open-Closed Principle, OCP&#xff09; 三、依赖倒置原则&#xff08;‌Dependency Inversion Principle, DIP&#xff09; 四、里氏替换原则&am…...

利用多商家AI智能名片小程序提升消费者参与度与个性化体验:重塑零售行业的忠诚策略

摘要&#xff1a;在数字化浪潮席卷全球的今天&#xff0c;零售行业正经历着前所未有的变革。消费者对于购物体验的需求日益多样化、个性化&#xff0c;而零售商则面临着如何将一次性购物者转化为品牌忠诚者的巨大挑战。多商家AI智能名片小程序作为一种新兴的数字营销工具&#…...

Scala 闭包

Scala 闭包 Scala 闭包是一个非常重要的概念&#xff0c;它允许我们创建可以在稍后某个时间点执行的功能片段。闭包是一个函数&#xff0c;它捕获了封闭范围内的变量&#xff0c;即使在函数外部&#xff0c;这些变量也可以在函数内部使用。这使得闭包成为处理异步操作、回调和…...

前端JS总结(中)

目录 前言 正文 对象&#xff1a; 分类&#xff1a; 自定义对象&#xff1a; 内置对象&#xff1a; 重点&#xff1a; 常用内置对象&#xff1a; 字符串对象&#xff1a;String 获取字符串长度&#xff1a; 大小写转换&#xff1a; 获取某个字符&#xff1a; 截取字…...

elasticsearch的match_phrase匹配及其可能导致的查询问题

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

C++快速理解之继承

一、继承和派生 1.是什么&#xff1f; C 中的继承是类与类之间的关系&#xff0c;与现实世界中的继承类似 例如&#xff1a;儿子继承父亲的财产 继承&#xff08;Inheritance&#xff09;可以理解为一个类从另一个类获取成员变量和成员函数的过程 例如&#xff1a; 类B继承…...

Node.JS - 基础(Express)

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

I/O复用

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

【验证可用】解决安装SQL Server数据库时,报错“启用 windows 功能 NetFx3 时出错,错误代码:-2146498298......“的问题

目录 背景一. 报错信息1.1 报错的图片信息1.2 报错的文字信息 二. 解决报错2.1 下载 NetFx3.cab 文件2.2 执行命令 三. SQL Server 修复安装 背景 一次在阿里云服务器安装 SQL Server 2012时&#xff0c;系统报错了&#xff0c;导致安装进行不下去…通过在网上查找了多种解决方…...

STM32的SDIO接口详解

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

docker容器常用指令,dockerfile

docker&#xff1a;容器&#xff0c;主要是解决环境迁移的问题&#xff0c;将环境放入docker中&#xff0c;打包成镜像。 docker的基本组成&#xff1a;镜像(image)&#xff0c;容器(container)&#xff0c;仓库(repository)。镜像相当于类&#xff0c;容器相当于类的实例对象…...

C语言学习笔记 Day11(指针--下)

Day11 内容梳理&#xff1a; 目录 Chapter 7 指针 7.6 指针 & 函数 &#xff08;1&#xff09;形参改变实参的值 &#xff08;2&#xff09;字符数组作为函数参数 1&#xff09;合并字符串 2&#xff09;删掉字符串中空格 &#xff08;3&#xff09;指针作为函数返…...

Kerberos身份认证原理与企业级排错实战指南

1. 这不是“另一个登录框”&#xff0c;而是一套精密运转的身份验证齿轮系统很多人第一次听说 Kerberos&#xff0c;是在公司内网登录邮箱或访问内部系统时&#xff0c;看到那个带小盾牌图标的弹窗——“正在使用 Kerberos 协议进行身份验证”。于是下意识觉得&#xff1a;“哦…...

华硕笔记本终极性能控制指南:用G-Helper完全替代Armoury Crate

华硕笔记本终极性能控制指南&#xff1a;用G-Helper完全替代Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zen…...

从CTF题看RSA安全:为什么你的密钥不能‘共享素数’?

从CTF实战看RSA密钥安全&#xff1a;那些年我们踩过的坑 在网络安全竞赛和实际渗透测试中&#xff0c;RSA算法的错误实现方式往往成为突破的关键点。本文将通过典型CTF赛题案例&#xff0c;揭示五种常见RSA实现漏洞背后的数学原理和安全启示&#xff0c;帮助开发者在实际项目中…...

如何进行TVA仿真引擎的“光照地狱”训练?

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

基于随机森林的低成本传感器机器学习校准实践指南

1. 项目概述&#xff1a;当低成本传感器遇上机器学习校准在物联网和智能感知系统铺天盖地的今天&#xff0c;低成本传感器几乎无处不在。从监测办公室的空气质量&#xff0c;到追踪城市街道的噪音污染&#xff0c;再到农业大棚里的温湿度控制&#xff0c;这些价格亲民的“小眼睛…...

TV Bro电视浏览器:为智能电视打造的最佳遥控器上网解决方案

TV Bro电视浏览器&#xff1a;为智能电视打造的最佳遥控器上网解决方案 【免费下载链接】tv-bro Simple web browser for android optimized to use with TV remote 项目地址: https://gitcode.com/gh_mirrors/tv/tv-bro 还在为智能电视上网操作不便而烦恼吗&#xff1f…...

统信UOS浏览器书签同步难题?一招搞定所有新用户默认书签配置

统信UOS浏览器书签批量配置&#xff1a;系统管理员的高效部署指南在企业或教育机构的IT运维工作中&#xff0c;统信UOS作为国产操作系统的代表&#xff0c;其浏览器书签的统一管理常常成为系统管理员面临的挑战。想象一下&#xff0c;每当有新员工入职或学生入学&#xff0c;都…...

BetterJoy终极指南:3分钟让你的Switch手柄变身PC游戏神器

BetterJoy终极指南&#xff1a;3分钟让你的Switch手柄变身PC游戏神器 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.c…...

ModernWMS核心功能详解:从ASN入库到Dispatch出库的完整工作流

ModernWMS核心功能详解&#xff1a;从ASN入库到Dispatch出库的完整工作流 【免费下载链接】ModernWMS The open source simple and complete warehouse management system is derived from our many years of experience in implementing erp projects. We stripped the origin…...

3PEAK思瑞浦 TPA6531-S5TR SOT23-5 运算放大器

特性 供电电压:1.75V至5.5V 偏移电压:1.5mV(最大值) 最大可调工作频率:300kHz&#xff0c;斜率:0.15V/us 轨到轨输入和输出 0.1赫兹至10赫兹电压噪声:1伏峰值 开关电源时无显著输出抖动 低功耗:每通道最大25安培 工作温度范围:-40C至125C...