C++(18): C++:std::bind的使用

1. 简述

        std::bind是C++11标准库中的一个功能强大的函数适配器,它可以将一个可调用对象(函数、函数指针、函数对象或者成员函数指针)与其参数绑定,生成一个新的可调用对象。这个新的可调用对象可以像普通函数一样被调用,但是其内部实际上执行的是我们绑定的原始可调用对象。

        虽然在C++11之后引入了lambda表达式可以替代并实现std::bind的功能,但是我们在此还是做一下简单的介绍。

2. 什么情况下使用std::bind?

        std::bind提供了一种机制来创建可调用的函数对象,这些对象可以封装函数调用并允许参数的预绑定、重排和默认值插入等操作。那么一般什么情况下会使用std::bind呢? 

回调和事件处理

        在异步编程或事件驱动的系统中,经常需要将函数或方法作为回调传递给其他函数或系统组件。std::bind允许你创建一个绑定特定参数的可调用对象,这个对象之后可以作为回调传递,并在需要时被调用。

参数绑定与柯里化(Currying)

        std::bind允许你预先为函数绑定一些参数,生成一个新的函数对象。这类似于函数式编程中的柯里化概念,即把一个接受多个参数的函数变换成一系列使用一个参数的函数。

延迟计算(Lazy Evaluation)

        通过std::bind绑定的函数可以在需要时才执行,从而实现延迟计算。这在某些场景下可以提高程序的效率,例如,在需要时才计算某个复杂表达式的值。

        成员函数和对象绑定:std::bind可以绑定类的成员函数,并指定该成员函数所属的对象实例。这使得我们可以将成员函数作为普通函数使用,而无需关心对象的状态。

灵活性

        std::bind提供了很大的灵活性,允许你重新排列参数,插入默认值,甚至忽略某些参数。

与旧代码的兼容性

        在C++11之前,没有lambda表达式,std::bind提供了一种方式来创建可调用的函数对象,这在当时是非常有用的。

线程编程

        在多线程编程中,std::bind经常与std::thread一起使用,以启动新线程并执行特定的函数或方法。

3. std::bind绑定函数

#include <functional>  #include <iostream>  void print_sum(int a, int b){std::cout << a + b << std::endl;  }  int main(int argc, char* argv[]){auto bound_fn = std::bind(print_sum, 5, std::placeholders::_1);  bound_fn(10);  ///< 输出15,因为5 + 10 = 15  return 0;  }

        在这个例子中,我们创建了一个新的可调用对象bound_fn,它将print_sum函数的第一个参数绑定为5,第二个参数保留为占位符std::placeholders::_1。当我们调用bound_fn(10)时,实际上执行的是print_sum(5, 10)。

        std::placeholders是一个命名空间,其中包含了一系列的占位符,用于在std::bind中表示原始可调用对象的参数。例如,std::placeholders::_1表示第一个参数,std::placeholders::_2表示第二个参数,以此类推。如果我们在std::bind中使用了占位符,那么在调用绑定的函数时,我们可以传递相应的参数来替换这些占位符。

4. 绑定类成员函数

#include <functional>  #include <iostream>  class MyClass{public:  void eval_display(int a, int b){  std::cout << a + b << std::endl;  }  };  int main(int argc, char* argv[]){MyClass obj;  auto bound_fn = std::bind(&MyClass::eval_display, &obj, std::placeholders::_1, std::placeholders::_2);  bound_fn(5, 10);  ///< 输出15,因为5 + 10 = 15  return 0;  }

        在上述例程中,我们绑定了类MyClass的成员eval_display,之后我们可以像调用普通函数一样调用MyClass的成员eval_display。

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

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

相关文章

WebMvcConfigurer(一)介绍

一、简介 WebMvcConfigurer配置类其实是Spring内部的一种配置方式&#xff0c;采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制&#xff0c;可以自定义一些Handler&#xff0c;Interceptor&#xff0c;ViewResolver&#xff0c;MessageConverter。基于j…

【NR RedCap】Release 18标准中对5G RedCap的增强

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

leetcode_34.在排序数组中查找元素的第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 题目描述&#xff1a;给你一个按照非递减顺序排列的整数数组 nums&#xff0c;和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target&#xff0c;返回 [-1, -1]。 你必须设计…

ArcGIS小技巧—你分得清投影与定义投影吗

Arcmap中关于投影的工具有四个&#xff0c;分别是定义投影、投影、投影栅格、批量投影。这四个工具既有相同之处也有不同之处&#xff0c;下面我将一一介绍。 ①定义投影&#xff1a;Arcmap中关于定义投影工具是这样描述的&#xff1a;“所有地理数据集均具有一个用于显示、测…

PD虚拟机和双系统哪个好 Mac建议装双系统吗

在当今数字化时代&#xff0c;对于部分使用Mac电脑的用户来说&#xff0c;选择如何在系统中运行Windows或其他操作系统能节省大量精力。Parallels Desktop&#xff08;PD&#xff09;虚拟机和双系统是两种常见的选择&#xff0c;它们各自具有优势和限制。下面我们来看看PD虚拟机…

SM5308 兼容IP5306 2.1A充电 2.4A放电 移动电源IC芯片

SM5308电源管理芯片的应用领域很广泛&#xff0c;主要包括&#xff1a; 1. 移动电源和充电宝&#xff1a;SM5308常用于移动电源解决方案中&#xff0c;因为它可以高效地管理锂电池的充放电过程&#xff0c;并且提供了高集成度和低外部元件数量的需求。 2. 智能手机和平板电脑…

页面分页打印,echarts图解决办法;生成PDF

1&#xff1a;echarts图片前端打印不是很完美&#xff0c;对于VUE2.0版本不是很有好 2&#xff1a;360浏览器不支持vue的最新版本的插件vue3-print-nb 3&#xff1a;vue-print-nb 可以打印带有echarts 一页内容&#xff0c;并且还存在bug&#xff0c;第一次点击打印没有&…

BIM为电力、供水和道路工程无缝集成,助力智慧城市计划

在道路和公用事业工程中利用 Bentley Open 系列应用程序&#xff0c;项目进度加快 10%&#xff0c;节省成本 1,000 万印度卢比 推动基础设施现代化&#xff0c;实现智慧城市愿景 Dholera特别投资区位于印度艾哈迈达巴德西南 100 公里处&#xff0c;毗邻古吉拉特邦的贸易中心&a…

英智数字孪生机器人解决方案,赋能仓库物流模式全面升级

工业机械臂、仓储机器人、物流机器人等模式的机器人系统在现代产业中扮演着愈发重要的角色&#xff0c;他们的发展推动了自动化和智能化水平的提高&#xff0c;有助于为制造业、物流业、医疗保健业和服务业等行业创造新效率并提升人们的生活质量。 行业面临的挑战 机器人开发、…

区块链 | OpenSea:Wyvern protocol

目录 Wyvern on the OpenSea 1 交易流程 1.1 卖家 1.2 买家 2 组成部分 2.1 WyvernProxyRegistry 2.2 OwnableDelegateProxy 2.3 NFT Contract 2.4 OpenSea Order Book 2.5 Wyvern Exchange Contract 3 总结 &#x1f951;原文&#xff1a;Wyvern on the …

如何写好代码?

文章目录 前言内容代码应当易于理解命名注释格式循环和逻辑设计函数设计类其它&#xff08;编程规范、静态检查工具&#xff09;重构 前言 在软件开发领域&#xff0c;写好代码是至关重要的一环。不论是在学校学习的学生&#xff0c;刚刚毕业的应届生&#xff0c;还是刚步入企…

数据结构-二叉树-链式

一、链式二叉树的结构 typedef int BTNodeDataType; typedef struct BTNode {BTNodeDataType data;struct BTNode* left;struct BTNode* right; }BTNode; 二叉树的前中后序遍历 前序&#xff1a;根左右 中序&#xff1a;左根右 后序&#xff1a;左右根 void PreOrder(BTNo…

spring boot3单模块项目工程搭建-上(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 写在前面 本文…

uniapp视频播放器(h5+app)

关于uniapp视频播放器遇到的一些问题&#xff0c;mark下。 中途遇到了很多问题&#xff0c;如果有相同的伙伴遇到了类似的&#xff0c;欢迎交流 官方的video播放器在app上不友好&#xff0c;有以下功能不支持。 loadedmetadata、controlstoggle不支持导致只能手写控制层。 不…

Linux实验一:Linux环境及编程工具

目录 一、实验目的二、实验内容三、参考代码四、实验步骤步骤1. 编辑源代码test1.c步骤2. 编译源代码test1.c步骤3. 调试test1步骤4. 重新编译运行test1.c 五、实验结果六、实验总结 一、实验目的 1、掌握Linux C开发过程中的基本概念&#xff1b; 2、掌握如vim&#xff0c;GC…

keepalived检测Nginx高可用

node1 192.168.136.55 node2 192.168.136.56 两台机器都安装dnf install keepalived nginx [rootnode1 ~]# echo "web test page, ip is hostname -I." > /usr/share/nginx/html/index.html [rootnode2 ~]# echo "web test page, ip is hostname -I."…

【ARMv9 DSU-120 系列 4 -- Utility bus 详细介绍 1】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 DSU-120 Utility bus事务类型访问大小事务长度安全状态总结缓存控制(ARCACHEU 或 AWCACHEU)突发类型(ARBURSTU 或 AWBURSTU)锁定信号(ARLOCKU 或 AWLOCKU)Utility bus acceptance capabilities

【科学研究】农村出身:一种复杂的情感结构

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LeetCode 面试题 17.08 —— 马戏团人塔

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 首先&#xff0c;我们对人的身高按照从小到大排序&#xff0c;特别注意&#xff0c;对于身高相等的人&#xff0c;要按照体重从高到低排序。这时候&#xff0c;序列已经满足了在上面的人要比下面的人矮一点&#…

在开发软件以便未来本地化到其他语言时需要考虑的事项

我们准备了一份关于开发软件以便未来本地化到其他语言时需要考虑的事项的简要指南。这非常重要&#xff0c;因为您的软件在其他国家市场上的销售可能会带来比本国市场更多的收入。 在开发软件时考虑到未来本地化到其他语言的一些重要方面包括&#xff1a; 设计多语言支持&…