std::bind
关于bind的用法:可将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。
auto newCallable = bind(callable,arg_list)
其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。
即,当我们调用newCallable时,newCallable会调用callable,并传给它arg_list中的参数。
在我看来std::bind,其实就是提前绑定某个函数的部分参数或者所有参数后生成一个新的函数。
代码
int showAB(int a,int b)
{
std::cout<<"a="<<a<<" b="<<b<<std::endl;
return a;
}
class Test{
public:
int fun(int a,int b,int c)
{
std::cout<<"a:"<<a<<":b:"<<b<<":c:"<<c<<std::endl;
return a+b+c;
}
};
int main()
{
auto f1 = std::bind(showAB,12,22);
//相当于生成函数 int(){return showAB(12,22);}
f1(2);
auto f2 = std::bind(showAB,std::placeholders::_1,12);
//相当于生成函数 int(int a){return showAB(a,12);}
f2(1);
Test t;
auto f3 = std::bind(&Test::fun,t,1,2,4);
//相当于生成函数 int(){t.fun(1,2,4)}
f3();
return 0;
}
所以任何函数通过std::bind都可以生成一个无参数函数,这个对统一管理任务,线程池的构造很重要。
网友评论