bind函数在头文件functional中定义。 可以将bind函数视为通用函数适配器,它接受可调用对象并生成新的可调用对象以“适应”原始对象的参数列表。
bind函数:接受函数名称作为参数,并生成新函数。
autonewcallable=bind (呼叫球,arg_list );
arg_list的参数可能包括_1、_2等。 这些是新函数newCallable的参数。
在该博客lambda表达式的介绍中,讨论了find_if的第三个参数问题。 当时用lambda公式解决,如果有bind函数,bind函数也可以解决。
解决方案: bind (检查_ size,_1,sz ) ) ) ) ) ) ) ) ) )。
autoidx=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 ) s,6 )。 newcall也有两个参数,但第二个参数有默认值6。 新呼叫(conststrings,size_t sz=6); 因此,调用newCall时,传递参数就足够了。
注意: _1、_2等位于命名空间placeholder中,因此使用:
//_1,_n已确定为std:placeholders
usingnamespacestd :3360 placeholder s;
使用bind参数:
//g是具有两个参数的可调用对象
autog=bind(func,a,b,_2,c,_1); //func是一个有五个参数的函数
调用g(x,y )将等于func(a ) a、b、y、c、x
示例:
#包含
#包含
#包含
#包含
#包含
用户命名空间STD;
//_1,_n已确定为std:placeholders
usingnamespacestd :3360 placeholder s;
OOLcheck_size(conststrings,string:size_type sz ) )。
returns.size(=SZ;
}
ool shorter (常数字符串,常数字符串b ) )。
return a.size () b.size );
}
ostreamprint(ostreamOS,const string s,const char c )。
//c=',';
返回操作系统Sc;
}
int main () )。
/*
用bind实现了与lambda相同的功能
vector svec{'aab '、' d '、' aa '、' bb '、' e '、' bbb'};
stable_sort(svec.begin ),svec.end ),[ (常数字符串,常数字符串b ) )。
return a.size () b.size );
);
string:size_type sz=3;
autoidx=find_if(svec.begin (,svec.end ),bind ) check_size,_1,sz );
cout *idx endl;
idx=find_if(svec.begin (,svec.end ),[SZ] ) conststrings ) )
returns.size(=SZ;
);
cout *idx endl;
*/
/*
用bind改变原始函数的参数位置
//升序
vector svec{'aab '、' d '、' aa '、' bb '、' e '、' bbb'};
sort(svec.Begin )、svec.end )和shorter );
自动常数: svec (for ) {
cout s ' ';
}
cout endl;
由于调换了shorter参数的位置,所以变为降序
sort(svec.begin )、svec.end )、bind ) shorter、_2、_1);
自动常数: svec (for ) {
cout s ' ';
}
cout endl;
*/
//bind引用必须使用ref或cref函数将对象转换为引用,不能使用
ostream os=cout;
常数char c=' ';
vector svec{'aab '、' d '、' aa '、' bb '、' e '、' bbb'};
for_each(svec.begin )、svec.end )、[os,c ] (conststrings ) ) ) ) ) )。
OSc;
);
操作系统结束;
for_each(svec.begin )、svec.end )、bind (打印)、ref(OS )、_1、cref(c )、c );
操作系统结束;
cout c endl;
}
总结
以上是小编介绍的c/c标准库bind函数的详细内容。 希望对大家有帮助。 如果有问题的话请发表评论。 小编马上回复大家。 在此也感谢您对脚本房屋网站的支持!