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

std::bind 的用法

std::bind 是 C++11 中引入的一个功能,它属于 <functional> 头文件中的一部分。std::bind 可以用来绑定函数和对象到特定的参数,从而创建一个新的可调用对象。这个新的可调用对象可以带有预设的参数,这样在调用时就可以省略这些参数或者改变参数的顺序。

下面是 std::bind 的一些基本用法:

1. 绑定函数

#include <iostream>
#include <functional>void func(int a, int b, int c) {std::cout << a << ", " << b << ", " << c << std::endl;
}int main() {// 使用 std::bind 绑定函数 func,预设第一个参数为 1auto bindFunc = std::bind(func, 1, std::placeholders::_2, std::placeholders::_1);// 调用时只需要提供剩下的两个参数bindFunc(3, 2); // 输出: 1, 2, 3return 0;
}

在这个例子中,std::placeholders::_1 和 std::placeholders::_2 是占位符,分别代表新的可调用对象在被调用时传入的第一个和第二个参数。

2. 绑定成员函数

#include <iostream>
#include <functional>class A {
public:void memberFunc(int a, int b) {std::cout << a << ", " << b << std::endl;}
};int main() {A obj;// 绑定成员函数,需要提供对象指针或引用以及成员函数指针auto bindMemberFunc = std::bind(&A::memberFunc, &obj, std::placeholders::_1, 100);bindMemberFunc(10); // 输出: 10, 100return 0;
}

在这个例子中,我们绑定了类 A 的成员函数 memberFunc,并且预设了第二个参数为 100

如果在类里面绑定,上面的obj的就使用 this

3. 改变参数顺序

#include <iostream>
#include <functional>void func(int a, int b) {std::cout << a << ", " << b << std::endl;
}int main() {// 使用 std::bind 改变参数顺序auto bindFunc = std::bind(func, std::placeholders::_2, std::placeholders::_1);bindFunc(2, 1); // 输出: 1, 2return 0;
}

在这个例子中,我们通过 std::bind 改变了函数 func 参数的顺序。

注意事项

  • 使用 std::bind 时需要包含 <functional> 头文件。
  • std::bind 返回的是一个函数对象(functor),它可以存储状态,因此可以用来预设参数。
  • std::bind 可以与 std::function 结合使用,后者是一个通用的多态函数包装器。
  • 从 C++17 开始,推荐使用 lambda 表达式来替代 std::bind,因为 lambda 表达式通常更加直观和易于理解。

由于 std::bind 在某些情况下可能不如 lambda 表达式直观,现代 C++ 编程中 lambda 表达式的使用更为普遍。


http://www.mrgr.cn/news/63713.html

相关文章:

  • Linux·进程间通讯(管道)
  • 通用AT指令
  • pnpm install安装element-plus的版本跟package.json指定的版本不一样
  • 基于卷积神经网络的柑桔病害识别与防治系统,resnet50,mobilenet模型【pytorch框架+python源码】
  • (七)JavaWeb后端开发1——Maven
  • 性能测试|linux服务器搭建JMeter+Grafana+Influxdb监控可视化平台
  • 车载总线系列 --- CAN FD简介
  • scrapy爬取名人名言
  • 动态添加的元素点击事件无效
  • sklearn 实现随机森林分类器 - python 实现
  • CSP-S 2023 提高级 第一轮试题(初赛)答案及解析
  • 因为Flock,Flutter又凉一次
  • 《双指针篇》---双指针算法原理
  • SpringMvc day1101
  • L2.【LeetCode笔记】反转链表
  • vue3项目编码时相对合理的顺序推荐仅个人记录备用
  • elementplus组件库el-menu组件中的default-active属性使用
  • Mac “屏幕保护程序启动或显示器关闭后需要密码“无效
  • AIGC生成式人工智能——泼天的富贵(三)
  • 飞机布雷盖航程公式
  • python实战项目51:selenium结合requests获取某众点评评论
  • 价值为王,浅析基础大模型行业应用创新发展新路径
  • YOLO11改进 | Neck | 有效提升小目标检测效果,附完整代码结构图【论文必备】
  • C++之多态(上)
  • 推荐一款音乐制作软件:Ableton Live Suite
  • 不可能的任务:这款浏览器竟然可以同时满足速度与隐私