function和lamda以及bind

5 分钟阅读 438 字 + 789 词
std::function 类模板
是什么?
是一个 抽象了函数参数和函数返回值 类模板
抽象
  • 把任意函数包装成一个对象,该对象可以保存,传送和复制。
  • 动态绑定,只要修改对象(赋值不同的function对象),实现类似多态的效果
用途
  • 保存普通函数,类的静态成员函数
  • 保存仿函数
  • 保存类成员函数
  • 保存lambda表达式
  • 保存bind返回的函数对象
仿函数(函数对象)
是什么?
重载了操作符()的类
特征
  • 可以有状态,通过成员变量进行存储状态
  • 有状态的函数对象称之为闭包
lambda表达式
是什么?
是一种方便 创建匿名函数的语法糖
构成
[]捕获列表
  • 值捕获 默认只读,不能修改 。 添加mutable之后可读可写,但是并不会修改外部变量的值
  • 引用捕获 可读可写,会修改外部变量的值
[]捕获列表本质是 将外部变量转变为类的成员变量
()参数列表
-
指定返回值
原理
  • 编译的时候, 将lambda表达式转变为一个函数对象
  • 根据lambda参数列表 重载operator()操作符
bind函数适配器
是什么?
  • 用来通过 绑定函数以及函数参数 的方式生成函数对象的模板函数
  • 提供占位符,实现灵活参数绑定
特征
  • 绑定函数以及函数参数
  • 允许修改参数顺序
总结
  • function用来描述 函数对象 类型
  • lambda表达式用来 生成函数对象 (可以访问外部变量的匿名函数)
  • bind也是用来 生成函数对象 (函数和参数进行绑定生成函数对象)