bind作用和形式
bind用于将一个可调用对象绑定到新的可调用对象上,新对象的参数就是被绑定对象参数列表中的占位符所占据的位置的参数 其调用形式如下:
代码语言:javascript复制auto newCallable=bind(callable,arg_list);
bind的第一个参数为一个可调用对象,可调用对象是指可以对其使用调用运算符()的对象。 可调用对象常用的有函数、函数指针、重载了函数调用运算符的类和lambda表达式 arg_list是调用对象的参数列表,可以包含 _ 1, _ 2等这样的占位符,用于占据调用对象的参数位置,数字代表着是第几个参数,占位符被定义在,命名空间placeholders中。也可以包含被绑定对象的参数。arg_list应该和被绑定对象的参数一样多。
example
代码语言:javascript复制int sum(int a, int b, int c) {
if (a > b)return a c;
return b c;
}
auto add = bind(sum, _1, _2, 10);
这样就将sum绑定由bind新生成的一个调用sum的对象上; _ 1表示新对象中的第一个参数,是一个占位符。 也就是说,实际上,这个bind会add( _ 1, _ 2)会被映射成为sum( _ 1, _ 2, 10),此时add的参数就会代替原来的占位符成为调用sum的参数,当然前提是两者的类型要匹配。 比如:add(20,10)实际调用为sum(20,10,10),结果为30;
参数顺序可换
代码语言:javascript复制#include<bits/stdc .h>
using namespace std;
using namespace placeholders;
int sum(int a, int b, int c) {
if (a > b)return a c;
return b c;
}
int main(void) {
auto add = bind(sum, _1, _2, 10);
auto add2 = bind(sum, _2, _1, 10);
int t = add(20, 10), t1 = add2(10,20);
cout << t << " " << t1 << endl;
return 0;
}
bind也可以换原来参数的顺序,因为实际在调用新对象时,我们传递给新对象的参数实际就是那些占位符占据的位置的参数,所以上面调用情况如下: add(20,10) 时,参数20对应占位符1,参数10对应占位符2,故实际调用为sum(20,10,10); add2(10,20)时,参数10对应占位符1,参数20对应占位符2,故实际调用为sum(20,10,10); 从而重排了参数顺序。