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页。

posted @ 2017-05-18 11:02  我是畅游海  阅读(1200)  评论(0编辑  收藏  举报