bind函数接受一个可调用对象,生成一个新的可调用对象。定义在头文件functional中。
调用bind的一般形式:
auto newCallable=bind(Callable,arg_list);
=====================================================================
下面是一个例子:
bool check_size(const string &s,string::size_type sz)
{
return s.size()>=sz;
}
用bind函数的形式:
auto check6=bind(check_size,_1,6);
这个函数表示,check_size的两个参数一个是_1,第二个是6。之所以用绑定函数的原意是一位有些函数对象对参数的要求比较严格,但是可以通过bind改变函数对象的参数个数。
auto wc=find_if(word.begin(),word.end(),bind(check_size,_1,sz))
等价于
auto wc=find_if(word.begin(),word.end(),[sz](const string &a){return a.size()>sz;});
=====================================================================================================================
可以用bind重新调整参数:
using std::placeholders::_1;
using std::placeholders::_1;
auto g=bind(f,a,b,_2,c,_1);
则g(X,Y)=f(a,b,Y,c,_X);
=====================================================================================================================
绑定引用参数
默认情况下,bind的那些不是占位符的参数被拷贝到bind返回的可调用对象中。但是与lambda类似,有时对有些绑定的参数我们希望以引用的方式传递,或是要绑定的参数的类型无法拷贝。
例如:for_each(word.begin(),word.end(),[&os,c](const string &s){return os<<s<<c;})
可以很容易的编写一个函数完成相同工作:
ostream &print(ostream &os,const string &s,char c)
{return os<<s<<c;}
但是for_each(word.begin(),word.end(),bind(print,os,_1,‘ ‘));是错误的。
原因是bind拷贝其参数,而我们不能拷贝一个ostream。如果我们我们希望传递给bind一个对象的而不是拷贝,就必须使用标准的ref函数(定义在functional头文件中)。
for_each(word.begin(),word.end(),bind(print,ref(os),_1,’ ‘));
cref :传递const 的引用。
======================================================================旧版本的bind已经被弃用