Bind是一组用于函数绑定的模板。绑定函数时,可以指定部分或全部参数,也可以不指定参数,还可以调整每个参数的顺序。本文主要介绍c/c标准库的bind函数,有需要的朋友可以参考一下。
绑定函数在头文件functional中定义。bind函数可以看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适配”原对象的参数列表。
绑定函数:接收一个函数名作为参数,并生成一个新函数。
auto newCallable=bind(callbale,arg _ list);
arg_list中的参数可能包括_1、_2等。这些是新函数newCallable的参数。
在这篇博客对lambda表达式的介绍中,讨论了find_if的第三个参数的问题。当时是用lambda表达式解决的,但也可以用bind函数解决。
解决方法:bind(check_size,_1,sz)
auto idx=find_if(svec.begin(),svec.end(),bind(check_size,_1,6));
实际上,newCall=bind(check_size,_1,sz)返回一个新函数newCall。这个newCall只接受一个参数,正好满足find_if的要求。
从find_if的角度,啊,newCall是一个单参数的函数,OK,没问题。
从程的角度来看,check_size是一个带两个参数的函数,但是sz(6)是要提前绑定newCall的。
调用newCall(s)时,实际调用的是check_size(s,6),相当于newCall,有两个参数,但第二个参数的默认值是6。newCall(const string s,size _ t SZ=6);所以调用newCall时,传递一个参数就够了。
注:_1、_2等。放在名称空间占位符中,所以使用:
//_1,_n在std:占位符中设置。
使用命名空间std:占位符;
绑定参数的用法:
//g是带有两个参数的可调用对象。
auto g=bind(func,a,b,_2,c,_ 1);//func是一个有5个参数的函数
调用G(X,Y),它等于func(a,b,Y,c,X)
示例:
#包括iostream
#包含矢量
#包含字符串
#包含算法
#包括功能
使用命名空间std
//_1,_n在std:占位符中设置。
使用命名空间std:占位符;
bool check_size(const string s,string:size_type sz){
return s . size()=SZ;
}
bool shorter(常量字符串a,常量字符串b){
返回a . size()b . size();
}
ostream print(ostream os,const string s,const char c){
//c=',';
返回OS s c;
}
int main(){
/*
//用bind实现与lambda相同的函数
vectorstring svec{'aab ',' d ',' aa ',' bb ',' e ',' BBB ' };
stable_sort(svec.begin(),svec.end(),[](常量字符串a,常量字符串b){
返回a . size()b . size();
});
string:size _ type SZ=3;
auto idx=find_if(svec.begin(),svec.end(),bind(check_size,_1,SZ));
cout * idx endl
idx=find_if(svec.begin(),svec.end(),[sz](常量字符串s){
return s . size()=SZ;
});
cout * idx endl
*/
/*
//使用bind更改原始函数的参数位置
//升序排列
vectorstring svec{'aab ',' d ',' aa ',' bb ',' e ',' BBB ' };
sort(svec.begin()、svec.end()、shorter);
for(自动常数s : svec){
cout s“”;
}
cout endl
//因为较短的参数的位置改变了,所以变成降序。
sort(svec.begin()、svec.end()、bind(shorter,_2,_ 1));
for(自动常数s : svec){
cout s“”;
}
cout endl
*/
//绑定引用,必须使用ref或cref函数将对象转换为引用,但不能使用。
ostream os=cout
const char c=“”;
vectorstring svec{'aab ',' d ',' aa ',' bb ',' e ',' BBB ' };
for_each(svec.begin()、svec.end()、[os,c](常量字符串s){
OS s c;
});
os endl
for_each(svec.begin(),svec.end(),bind(print,ref(os),_1,cref(c)));
os endl
cout c endl
}
总结
以上是边肖推出的c/c标准库bind函数的详细说明。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。