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

【C++ STL】bind适配器详解

std::bind适配器的详解

std::bind是 C++11 引入的函数适配器,位于头文件<functional>中。它可以将可调用对象(函数、函数指针、成员函数、函数对象等)与其部分参数绑定,生成一个新的可调用对象,这个新对象可以存储并在后续调用。它是传统bind1st/bind2nd的现代替代品,功能更强大且使用更灵活。

  • 基本语法
    • 可调用对象:可以是普通函数、函数指针、成员函数指针、函数对象(仿函数)等。
    • 参数:可以指定具体的值,也可以用占位符(std::placeholders::_1,_2, …)表示“将来调用时提供的参数”。
    • 返回一个新的可调用对象,其类型为std::bind返回的未指定类型(通常用autostd::function保存)。
    • 占位符定义在std::placeholders命名空间中,_1代表调用新对象时的第一个实参,_2代表第二个,依此类推。
#include <functional> auto bound_func = std::bind(可调用对象, 参数1, 参数2, ..., 参数N);

[!注意]
占位符的数量,必须等于“新函数对象需要接收的参数个数”,否则会编译错误。

绑定普通函数

using namespace std::placeholders; // 1、绑定所有参数,生成一个无参可调用对象 auto bound_fun1 = bind(add, 100, 200); int res = bound_fun1(); // 100 + 200 = 300 // 2、绑定部分参数 // // 第一个参数由调用时提供,第二个固定为100 auto bound_fun2 = bind(add, _1, 100); res = bound_fun2(200); // 200 + 100 = 300 // 交换参数顺序 auto bond_fun3 = bind(add, _2, _1); bond_fun3(100, 200); // 200 + 100 = 300

绑定仿函数

template<typename T> struct Multiply { T operator()(T a, T b) { return a * b; } }; int main() { using namespace std::placeholders; vector<int> v = { 1, 2, 3, 4 }; // 两种绑定方式都可以 // Multiply<int> mult; // auto bound_fun = bind(mult, _1, 10); auto bound_fun = bind(Multiply<int>(), _1, 10); for (int i : v) { cout << bound_fun(i) << endl; // 10 20 30 40 } return EXIT_SUCCESS; };

绑定类成员函数

绑定类成员函数时,需注意:第一个参数必须是“类对象的地址”(&对象)或“类指针”,后续参数为成员函数的参数(固定值/占位符)。

class Person { public: void printName(string name, int age) { cout << "name = " << name << ",age = " << age << endl; } }; int main() { using namespace std::placeholders; Person p; // 第一个参数&p是类对象的指针 auto bound_fun1 = bind(&Person::printName, &p, _1, 25); bound_fun1("张三"); // name = 张三,age = 25 return EXIT_SUCCESS; };

使用注意事项

  • 必须包含头文件functional,否则会出现编译错误;
  • 占位符的使用:占位符的数量必须与“新函数对象需要接收的参数个数”一致;占位符的序号(_1、_2)必须与新函数调用时的参数顺序对应;
  • 绑定类成员函数的注意点:必须传入类对象的地址(&对象)或类指针,否则无法调用成员函数;绑定const成员函数时,对象地址也需是const类型(若对象是const);
  • bind返回的函数对象类型复杂,建议用auto接收,避免手动写类型;
http://www.jsqmd.com/news/489680/

相关文章:

  • 情感操纵算法测试:技术伦理边界与防御体系构建
  • 量化开发实战手册·第2篇:数据源选型五大维度——像评估股票一样科学评估你的行情接口
  • 动态顺序表的实现(c语言)
  • db-scheduler 集群友好的java任务调度框架
  • 信息系统项目管理师案例真题(1)+解析
  • 【OpenCV 图像变换实战:旋转、模板匹配与金字塔操作】
  • 升降平台(solidworks)
  • 解惑|网课为啥不让下载?还设过期时间?真相藏在这
  • 计算机毕业设计java基于歌曲识别的音乐社交系统 基于分布式架构的高校博客社区平台的设计与开发 面向校园师生的高并发博客系统的构建与实现
  • jdbc通信原理
  • 目标函数(含罚函数处理)
  • JavaScript性能优化实战鼻堑
  • 安装 OpenClaw 时网络怎么配置?一篇讲清模型接入与代理设置
  • JavaScript性能优化实战耙暮
  • 【前端】最好用的本地组件库调试工具 yalc
  • 2026最新版 Android Studio 安装与配置全教程(保姆级)
  • 篇关于电脑cmd命令符开发代码的技术文章大纲
  • 人工智能代理AI Agent如何自动化CRM、Jira、计费和Slack之间的工作流程
  • 深刻理解HTTP
  • MinorGC的完整流程与复制算法深度解析
  • 企业用智能体要投入多少成本?2026避坑指南与主流产品横评
  • 2026年沈阳路灯厂TOP10榜单揭晓,哪家实力最强?
  • API 安全: 保护 AI 应用的交互接口
  • 分治算法应用:逆序计数(Counting Inversions)
  • 跨平台方案:Java如何支持多终端文件夹的目录结构分片上传与信创国产化适配?
  • Java 中 Date 与 LocalDate 的区别
  • cmu15445 25fall lec3个人笔记
  • 基于springboot的社交媒体平台的设计与实现
  • 揭秘:用分期乐2000元支付宝立减金回收的最佳方法 - 团团收购物卡回收
  • 海参最吸收的营养做法