function,lambda,bind之间的关系

1. std::function 类模板

  • 是什么:是 C++11 引入的函数包装器模板,能抽象函数的参数列表和返回值,把各类可调用实体(函数、函数对象等 )“包装” 成统一类型的对象,方便存储、传递。
  • 核心能力
    • 抽象与封装:不管是普通函数、lambda、仿函数,还是 bind 适配后的结果,都能被它包裹,让这些可调用体像普通对象一样存到容器、作为函数参数传递。
    • 模拟多态:通过替换不同的可调用对象(赋不同 function 实例),实现类似 “函数行为多态”,运行时动态切换逻辑。
  • 典型用途:需统一管理、传递函数逻辑场景,比如回调函数注册(GUI 事件回调、网络异步回调 )、把不同函数逻辑存进 std::vector<std::function<...>> 批量执行 。

2. lambda 表达式

  • 是什么:C++11 简化匿名函数对象创建的语法糖,能快速写短小、临时的函数逻辑,不用单独写 “仿函数类”。
  • 构成与特性
    • 语法拆解[捕获列表](参数列表) -> 返回值类型 { 函数体 } ,捕获列表决定能否用、如何用外部变量(值捕获默认只读,mutable 放开修改;引用捕获直接关联外部变量 );参数、返回值、函数体和普通函数逻辑一致。
    • 本质:编译时会被编译器转成匿名仿函数类(重载 operator() ),捕获的外部变量变成类成员,天然支持 “带状态的函数对象”,也叫闭包(有状态的函数对象)。
  • 典型用途:写临时、简短逻辑(算法自定义比较 sort 的排序规则 ),配合 STL 算法(for_each 遍历处理 ),或当轻量回调,不用单独定义函数 / 类。

3. bind 函数适配器

  • 是什么:C++11 里 <functional> 头文件的工具(std::bind ),用于 “绑定” 函数(或函数对象)的参数,生成新的可调用对象。
  • 核心能力
    • 参数绑定 / 占位:能固定函数部分参数(填具体值),剩下用 std::placeholders_1_2… )占位,调用时再传;也能调整参数顺序。
    • 生成函数对象:绑定后产出的结果是函数对象,可直接调用,或存到 std::function,也能当参数传递。
  • 典型用途:适配已有函数参数(比如把多参数函数转成少参数,符合回调期望 ),或调整参数顺序适配接口,让函数使用更灵活。

三者关系总结

  1. lambda 与 std::functionlambda 编译后是函数对象,可直接赋值给匹配签名的 std::function,让 std::function 承载 lambda 的逻辑,实现 “用统一类型管理匿名函数”。
  2. bind 与 std::functionbind 产出的函数对象,也能存到 std::function 里,用统一类型封装、传递绑定后的逻辑。
  3. lambda 与 bind:二者常配合:用 bind 预处理函数参数,再用 lambda 写灵活逻辑;或 lambda 里调用 bind 适配的函数,组合出更复杂调用。
  4. 统一角色std::function 是 “容器 / 载体”,负责类型抽象和统一管理;lambda 是 “快捷创建函数对象的语法”,轻量写临时逻辑;bind 是 “参数适配器”,调整函数调用方式。三者协作,让 C++ 处理函数式编程、回调、灵活调用更简洁高效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值