C++中参数绑定
1. 参数绑定
有些泛型函数只支持一元谓词,对于某些需要两个参数的lambda函数,可以使用参数捕获列表;对于那种只在一两个地方使用的简单操作,lambda表达式是最好用的。如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式,例如:
我们用find_f调用lambda比较一个string和一个给定大小:
1 find_if(words.begin(),words.end(),[sz](const string &a){return a.size()>= sz;});
我们可以很容易的编写一个完成同样工作的函数check_size:
1 bool check_size(const string &s, string::size_type sz) 2 { 3 return s.size() >= sz; 4 }
但是,我们不能用这个函数作为find_if的一个参数,这是可以考虑bind函数,其定义为functional头文件中,bind函数相当于一个函数适配器,相当于容器中的适配器。
2. bin函数
bin函数的一般形式是:
1 auto newCallable = bind(callable, arg_list)
其中,newCallable本身是一个可调用的对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即,当我们调用newCallable时,newCallable会调用callable,并传给它 arg_list中的参数 ,例如绑定check_size的sz参数
1 //check6 是一个可调用对象,接受一个string类型的参数 2 //并用此string和值6来调用check_size() 3 4 auto check6 =bind(check_size,_1,6);
使用bind,我们可以将原来基于lambda的find_if调用:
1 auto wc = find_if(words.begin(),words.end(),bind(check_size,_1,sz));
其中_1定义在命名空间placeholders中,可使用声明语句:
1 using namespace std::placeholders
对于绑定引用参数、const引用参数,可以用ref和cref函数,其定义在functional头文件中,具体可参考,C++ Primer 357页。