1.1.说明:
TR1引入bind,function 在头文件<functional>
bind将实际值绑定到函数(或函数指针,仿函数)的一个或所有参数上
换句化说可用现有函数或仿函数创建新的函数对象
1.2.实例:
#include<functional>
#include<iostream>
constexpr double multiply(const double x1,const double x2) noexcept{return x1*x2;}
int main(){
const auto result1=mltiply(10.5,5.0);
auto boundMultiplyFunctor=std::bind(multiply,10.5,5.0);
const auto result2=boundMultiplyFunctor();
1.3.bind允许在编程中使用局部应用或偏函数应用。
局部应用是一个过程,其中只有一部分函数参数绑定到值或变量,未绑定的参数有占位符_1,_2等替换。
这些占位符在命名空间std::placeholders中定义
const double mul(const double x,const double y)noexcept{return x*y;}
int main(){
using namespace std::placeholders;
auto mulBind10=bind(mul,_1,10.0);
cout<<mulBind10(5.0)<<endl;
}
1.4.局部函数应用是一种自适应计算,允许在各种情况下使用函数或仿函数
在占位符帮助下函数参数顺序可任意
auto mulBind=bind(mul,_2,_1);
1.5.std::Bind_helper<bool0,double(&)(double,double),const _placeholder<int2>&,const _Placeholder<int1> &>::type;
对于这个类型不方便阅读,可用auto。
在某些情况下必须指明类型可用类模板std::function,这是一个通用多态函数包装
该模板可用包装任意可调用对象(普通函数,仿函数,函数指针)并管理用于存储该对象的内存
std::function<double(double,double)> multiplyFunc=mul;
C++lambda的引入这些模板已经很少使用