Boost::bind

bind库在boost库导论中被称作绑定器,其实在STL中已经有类似的功能,称之为函数配接器

《C++标准库》中说明“所谓函数配接器是指能够将仿函数和另一个仿函数(或某个值,或某个

一般函数)结合起来的仿函数”

 

在STL中,对于函数对象,成员函数,一般函数分别设计了绑定器

比如函数对象是:bind1st,bind2nd,not1,not2

        成员函数是:mem_fun_ref, mem_fun 

        一般函数是:ptr_fun         

 

这种设计难以记忆,不方便使用。这种问题在boost::bind库中得到改进。

bind库之所以成功的一个关键就是它采用了统一的语法来创建函数对象,而且几乎没有对使用

该库的类型提出任何要求。这种设计使得程序员不必在关注如何编写与类型(函数对象or成员函

数or一般函数)一起工作的代码。

 

用法说明:

 

[cpp]   view plain copy
  1. class some_class {  
  2. public:  
  3.     typedef void result_type;  
  4.     void print_string(const std::string& S) const {  
  5.     std::cout<< s <<'\n';  
  6.     }  
  7. };  
  8.   
  9. void  print_string(const std::string s){  
  10.      std::cout<< s <<'\n';  
  11. }  
  12.   
  13. int main(){  
  14.   (boost::bind(&print_string,_1))("Hello,Func!");//绑定一般函数,print_string有一个参数,所以使用一个占位符_1;  
  15.   
  16. some_class sc;  
  17.   
  18. (boost::bind(&some_class::print_string,_1,_2))(sc,"Hello member");//绑定一个成员函数,bind表达式的第一个参数必须是成员函数所在类的一个实例。另外some_class::print_string有一个参数,所以需要两个占位符_1,_2  
  19. }  

对于没有提供任何比较运算符的类,可以使用bind,经过组合以后利用STL预定义的比较谓词(比如less<type>)

来灵活得处理排序问题。

[cpp]   view plain copy
  1. class personal_info {  
  2.    string name;  
  3.    string surname;  
  4.    int age;  
  5. public:  
  6.     int age() const {  
  7.          return age;  
  8.     }  
  9. };//没有提供任何比较运算符  
  10.   
  11. //可以利用bind实现  
  12. boos::bind<bool>(less<int>(),_1,_2)   
  13. //上式表示向less传递两个参数,它们是personal_info来的age,因此只需取出age  
  14. boost::bind(less<int>(),  
  15.                     boost::bind(&personal_info::age,_1),//传递第一个参数  
  16.                     boost::bind(&personal_info::age,_2));//传递第二个参数。完美解决。  
[cpp]   view plain copy
  1. 此外对于类似代码  
[cpp]   view plain copy
  1. if(i > 5 && i < 10){  
  2.     //do something  
  3. }  
[cpp]   view plain copy
  1. 在处理容器是需要放在一个单独的函数中才生效。但是我们可以利用bind。  
[cpp]   view plain copy
  1. 利用bind,可以这样表示  
[cpp]   view plain copy
  1. <pre class="cpp" name="code">boost::bind(  
  2.             std::logical_and<bool>(),   
  3.             boost::bind(std::greater<int>(),_1,5,  
  4.             boost::bind(std::less_equal<int>(),_1,10));</pre><br>  
  5. <pre></pre>  
  6. <p>对于虚函数同样也可以绑定,情况和其他函数类似。</p>  
  7. <p> </p>  
  8. <p>总结:</p>  
  9. <p>在以下几种情况中使用bind库</p>  
  10. <p>1.在需要为自由函数及其部分或全部参数绑定调用时</p>  
  11. <p>2.在需要为成员函数及其部分或全部参数绑定调用时</p>  
  12. <p>3.需要组合嵌套的函数对象时</p>  
  13. <p><br>  
  14. <br>  
  15.  </p>  
  16. <p> </p>  
  17. <p> </p>  
  18. <p> </p>  

你可能感兴趣的:(c,工作,String,less,Class,fun)