转载自:http://blog.chinaunix.net/uid-20726254-id-3483489.html
std::bind通俗说就是一个 callabe adapter,因为有些场合需要的callable的参数个数不一样,可能实现差不多,完全重写又价值不大,以前的版本有bind1st和bind2nd,在c++11中这哥俩已经deprecated了,没准哪天就彻底game over了。
bind的语法格式:auto newCallable = bind(callable, arg_list); 看个简单例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include<functional>
using
namespace
std::placeholders;
void
f5(
int
i,
int
j)
{
if
(i<j) cout<<i<<endl;
else
cout<<j<<endl;
}
auto
f_bind = bind(f5,_1,10);
int
main()
{
f_bind(6);
f_bind(11);
cout<<
"end in main\n"
;
return
0;
}
|
新函数是f_bind,右侧bind的参数里带下划线的数字称为placeholder,表示新函数的第几个参数,当然最大的数值就是f_bind的参数个数。词条语句的意思是新函数f_bind包裹了f5,其第一个也是唯一的参数作为f5的第一个参数,同时将整数10作为f5的第二个参数传入。
placeholder在std内部定义的placeholders空间内,如果不用using声明下就要使用全称。其数值的编号要按顺序,但在bind参数列表可以不按书序出现:
1
2
3
|
auto
g = bind(f, a, b, _2, c, _1);
g(X, Y) ;
f(a, b, Y, c, X);
|
bind和lambda表达式一样,默认都是传值的,如果想要用引用,需要ref或cref函数,后者是常引用,也都位于functional头文件。
auto g = bind(f, ref(a), cref(b).....