bind库在boost库导论中被称作绑定器,其实在STL中已经有类似的功能,称之为函数配接器
《C++标准库》中说明“所谓函数配接器是指能够将仿函数和另一个仿函数(或某个值,或某个
一般函数)结合起来的仿函数”
在STL中,对于函数对象,成员函数,一般函数分别设计了绑定器
比如函数对象是:bind1st,bind2nd,not1,not2
成员函数是:mem_fun_ref, mem_fun
一般函数是:ptr_fun
这种设计难以记忆,不方便使用。这种问题在boost::bind库中得到改进。
bind库之所以成功的一个关键就是它采用了统一的语法来创建函数对象,而且几乎没有对使用
该库的类型提出任何要求。这种设计使得程序员不必在关注如何编写与类型(函数对象or成员函
数or一般函数)一起工作的代码。
用法说明:
class some_class {
public:
typedef void result_type;
void print_string(const std::string& S) const {
std::cout<< s <<'\n';
}
};
void print_string(const std::string s){
std::cout<< s <<'\n';
}
int main(){
(boost::bind(&print_string,_1))("Hello,Func!");//绑定一般函数,print_string有一个参数,所以使用一个占位符_1;
some_class sc;
(boost::bind(&some_class::print_string,_1,_2))(sc,"Hello member");//绑定一个成员函数,bind表达式的第一个参数必须是成员函数所在类的一个实例。另外some_class::print_string有一个参数,所以需要两个占位符_1,_2
}
对于没有提供任何比较运算符的类,可以使用bind,经过组合以后利用STL预定义的比较谓词(比如less<type>)
来灵活得处理排序问题。
class personal_info {
string name;
string surname;
int age;
public:
int age() const {
return age;
}
};//没有提供任何比较运算符
//可以利用bind实现
boos::bind<bool>(less<int>(),_1,_2)
//上式表示向less传递两个参数,它们是personal_info来的age,因此只需取出age
boost::bind(less<int>(),
boost::bind(&personal_info::age,_1),//传递第一个参数
boost::bind(&personal_info::age,_2));//传递第二个参数。完美解决。
此外对于类似代码
if(i > 5 && i < 10){
//do something
}
在处理容器是需要放在一个单独的函数中才生效。但是我们可以利用bind。
利用bind,可以这样表示
boost::bind( std::logical_and<bool>(), boost::bind(std::greater<int>(),_1,5, boost::bind(std::less_equal<int>(),_1,10));
对于虚函数同样也可以绑定,情况和其他函数类似。
总结:
在以下几种情况中使用bind库
1.在需要为自由函数及其部分或全部参数绑定调用时
2.在需要为成员函数及其部分或全部参数绑定调用时
3.需要组合嵌套的函数对象时