Boost::bind


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.需要组合嵌套的函数对象时



 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值