小结最近在写代码的时候,看到代码中使用了bind这个带参数绑定的标准库函数。程序是这样写的,speaker_play_routine_=newboost::thread(boost::bind(&Speaker::playRoutine,this));这是我们语音播放的一行代码。其中boost::thread是创建一个新的线程。线程执行函数是Speaker::playRoutine。执行函数由bind绑定。绑定函数可以修改普通函数来构造绑定对象。bind函数的第二个参数是this(this是C++中A关键字,也是一个const指针,指向当前对象,通过它可以访问当前对象的所有成员)是Speaker的一个参数::playRoutine类函数。短短的一行代码其实很考验一个人对C++的掌握深度,话不多说,进入今天的介绍,c++bind绑定函数。一、使用的由来我们看到我使用的代码是boost::bind,而大家在网上看到的介绍大多都是标准函数std::bind。事实上,boost::bind是标准函数std::bind1st和std::bind2nd的泛化。它支持任意函数对象、函数、函数指针和成员函数指针,并且能够将任何参数绑定到特定值或将输入参数路由到任意位置。bind不需要函数对象上的任何东西;特别是,它不需要result_type、first_argument_type和second_argument_type标准类型定义。2、使用介绍通常我们可以把bind函数看成是一个通用的函数适配器,它接受一个可调用对象,并生成一个新的可调用对象来“适配”到原对象的参数列表。bind可以根据当前存在的可调用对象构造一个新的可调用对象。通过bind,我们可以实现“动态生成新函数”的功能。总之,通过bind函数可以修改原来的函数,生成一个可以调用的对象,类似于函数的重载,但是我们不需要重写一个函数,可以用绑定功能。接下来我们看看bind函数是怎么使用的?绑定一个普通函数和一个函数指针:intfun(inta,intb,intc,intd,inte){returna+b-c+d-e;}intmain(){intx=1,y=2,z=3;autog=bind(fun,x,y,_2,z,_1);}这样的g是一个有两个参数的可调用对象,它的两个参数分别由_2和_1位表示。这个新的可调用对象将自己的参数作为第三个和第五个参数传递给fun,fun函数的第一个、第二个和第四个参数绑定到给定值x、y、z上。绑定成员函数:bind最常用的功能之一是从类成员函数构造绑定对象;想一想,如何从类成员函数(非静态成员函数)构造回调函数?答案很难,通过bind,但可以轻松完成。classSpeaker{publicSpeaker();~Speaker(){speaker_play_routine_->join();}voidplayRoutine(){}privateboost::thread*speaker_play_routine_{nullptr};};intmain(){speaker_play_routine_=newboost::thread(boost::bind(&Speaker::playRoutine,this));}这里的类的成员函数必须通过类的对象或者指针来调用,所以绑定的时候bind需要取出第一个参数的位置来指定一个类实例、指针或引用。注意:取地址运算符&必须加在成员函数前。参考文章:https://www.boost.org/doc/libs/1_65_1/libs/bind/doc/html/bind.html#bind.purpose.using_bind_with_functions_and_fu按照下面的二维码进行操作。转载本文请联系羽林君公众号。
