bind可以看作一个函数适配器,接受一个可调用对象生成一个新的可调用对象来适应原对象的参数列表。
形式:auto newCallable=bind(callable,arg_list);
newCallable本身是一个可调用对象,arg_list是一个逗号隔开的参数列表,对应callable中的参数。当调用newCallable时,newCallable会调用callable,并传递arg_list给它。
arg_list中可能包含形如_n的名字,n是一个整数,这些参数称为占位符,表示newCallable中的参数。_1为newCallable的第一个参数,_2为newCallable的第二个参数,以此类推。
1 bool check_size(const string& s,string::size_type sz) 2 { 3 return s.size()>=sz; 4 } 5 auto check6=bind(check_size,_1,6); 6 //check6是一个可调用对象,接受一个string类型的参数,即_1, 7 //_1出现在arg_list第一个位置,表示check6的此参数对应check_size的第一个参数。此参数是一个const string&。 8 9 string s="hello"; 10 bool b1=check6(s); 11 //check6接受s作为参数,check6调用check_size(s,6)
1 auto w=find_if(words.begin(),words.end(), 2 bind(check_size,_1,sz)); 3 //find_if接受一元谓词,使用bind解决了如何传递sz的问题
占位符_1,_2...定义子啊placeholders的命名空间中,而这个命名空间又定义在std中,使用时须把两个命名空间都写上,即
using namespace std;
using namespace std::placeholders;
注意参数位置表示的意思
_1,_2...:无论出现在什么位置,都是根据数字来表示这是newCallable的第几个参数
arg_list中参数的位置顺序即调用Callable的参数顺序
如:
auto g=bind(f,a,b,_2,c,_1)
那么g(X,Y),则调用f(a,b,Y,c,X)。
原文:https://www.cnblogs.com/cs0915/p/12722182.html