头文件: boost/bind.hpp

bind 是一组重载的函数模板.
用来向一个函数(或函数对象)绑定某些参数. 
bind的返回值是一个函数对象.

它的源文件太长了. 看不下去. 这里只记下它的用法:

9.1 对于普通函数

假如有函数 fun() 如下: 
 void fun(int x, int y) {
  cout << x << ", " << y << endl;
 }
现在我们看看怎么用 bind 向其绑定参数. 
对于像 fun 这样的普通函数. 若fun 有n个参数. 则 bind 需要 n+1 个参数: 原始函数的地址 以及 n个要绑定的参数.

第 1种用法: 
向原始函数 fun 绑定所有的参数
 boost::bind(&fun, 3, 4)     // bind的实参表依次为: 要绑定的函数的地址, 绑定到fun的第一个参数值, 第二个参数值...
        // fun有多少个参数, 这里就要提供多少个.
表示将 3 和 4 作为参数绑定到 fun 函数. 
因为绑定了所有的参数. 现在我们调用bind所返回的函数对象:
 boost::bind(&fun, 3, 4)( );  //无参数. 
就会输出 3, 4

第 2种用法: 
向原始函数 fun 绑定一部分参数
 boost::bind(&fun, 3, _1)    // bind的实参表依次还是: 要绑定的函数的地址, 要绑定到fun的第一个参数值, 然后注意
        // 因为我们不打算向fun绑定第2个参数(即我们希望在调用返回的Functor时再指定这个参数的值)
        // 所以这里使用 _1 来占位. 这里的 _1 代表该新函数对象被调用时. 实参表的第1个参数.
        // 同理下边还会用到 _2 _3 这样的占位符. 
这里只为fun绑定了第一个参数3. 所以在调用bind返回的函数对象时. 需要:
 boost::bind(&fun, 3, _1)(4);  //这个4 会代替 _1 占位符.
输出 3, 4
同理 boost::bind(&fun, _1, 3)(4); 
输出 4, 3

第 3种用法:
不向 fun 绑定任何参数
 boost::bind(&fun, _1, _2)   // _1 _2 都是占位符. 上边已经说过了.
所以它就是 将新函数对象在调用时的实参表的第1个参数和第2个参数 绑定到fun函数.  
 boost::bind(&fun, _1, _2)(3, 4);    // 3将代替_1占位符, 4将代替_2占位符.
输出 3, 4
同理 boost::bind(&fun, _2, _1)(3, 4);   // 3将代替_1占位符, 4将代替_2占位符.
会输出 4, 3  
同理 boost::bind(&fun, _1, _1)(3);     // 3将代替_1占位符
会输出 3, 3

对于普通函数就这些. 对于函数对象. 如:
 struct Func {
  void operator()(int x) {
   cout << x << endl;
  }
 } f;
绑定的时候可能要指出返回值的类型:
 boost::bind<void>(f, 3)();  //指出返回值的类型 void

9.2 对于非静态成员函数

假如有:
 struct A {
  void func(int x, int y) {
   cout << x << "," << y << endl;
  }
 };
 
 A a;  
 A* pa = new A; //指针
 boost::shared_ptr<A> ptr_a(pa);  //智能指针.
 
现在要向像 A::func 这样的非静态成员函数绑定. 
若A::func有n个参数, 则 bind 要有 n+2 个参数: 指向成员函数fun的指针, 绑定到this的对象, n个参数.
如:  
 boost::bind(&A::func, a, 3, 4)();    //输出 3, 4
 boost::bind(&A::func, pa, 3, 4)();   //输出 3, 4
 boost::bind(&A::func, ptr_a, 3, 4)();//输出 3, 4
同样可以用 _1 这样的占位符. 如:
 boost::bind(&A::func, _1, 3, 4)(ptr_a);//输出 3, 4

可以看出. 不论传递给bind 的第2个参数是 对象. 对象指针. 还是智能指针. bind函数都能够正常工作.

9.3 bind嵌套

有个类如下. 记录人的信息:
 class Personal_info {
  string name_;
  int age_;
 public:
  int get_age();
  string name();
 };

vector<Personal_info> vec; 
 ...
现在要对 vec 排序. 可以用 bind 函数做一个比较谓词
 std::sort(  
  vec.begin(),  
  vec.end(),  
  boost::bind( 
   std::less<int>(),    
   boost::bind(&personal_info::age,_1),     //_1 占位符是 sort 中调用比较函数时的第一个参数.
   boost::bind(&personal_info::age,_2)));   //_2 占位符是 sort 中调用比较函数时的第二个参数.

9.4 函数组合

假如有:
 vector<int> ints;
 ...
想用 std::count_if() 来求ints中有多少是 >5 且 <=10 的. 这在常规代码中通常就要写一个函数来实现这个谓词:
 if (i>5 && i<=10) ...
现在用 bind则可以:
 std::count_if(  
  ints.begin(),  ints.end(),  
  boost::bind(    
   std::logical_and<bool>(),    
   boost::bind(std::greater<int>(),_1,5),    
   boost::bind(std::less_equal<int>(),_1,10)));

9.5 绑定到成员变量

有:
 map<int, string> my_map;
 my_map[0]="Boost";my_map[1]="Bind";
现在要输出所有元素的 second 成员. 也就是输出这些字符串. 其中的打印函数如下:
 void print_string(const string& s) {  
  std::cout << s << '\n';
 }
则可以:
 for_each(  
  my_map.begin(),  
  my_map.end(),  
  boost::bind(
   &print_string, 
   boost::bind(&std::map<int,std::string>::value_type::second,_1)
   )
  );

【Boost】boost库中bind的用法相关推荐

  1. 【Boost】boost库中function的用法

    要开始使用 Boost.Function, 就要包含头文件 "boost/function.hpp", 或者某个带数字的版本,从"boost/function/funct ...

  2. Numpy库中einsum函数用法

    Numpy中einsum函数用法 一.一维张量收缩 二.二维张量收缩 2.1 收缩到零维张量 2.2 收缩到一维张量 三.三维张量收缩(重难点) 3.1 例1 3.2 例2 四.其他功能介绍(次要) ...

  3. python中bind的用法_Javascript中bind()方法的使用与实现

    在讨论bind()方法之前我们先来看一道题目: javascriptvar altwrite = document.write; altwrite("hello"); //1.以上 ...

  4. python中bind的用法_Python socket.bind方法代码示例

    本文整理汇总了Python中socket.bind方法的典型用法代码示例.如果您正苦于以下问题:Python socket.bind方法的具体用法?Python socket.bind怎么用?Pyth ...

  5. python中bind的用法_JS中的apply、call和bind的用法和区别

    apply和call两种调用方式中的this指向,表现出来的特征就是:对象可以'借用'其他对象的方法 obj对象有一个方法fn,obj1想借用obj的方法fn,可以用obj.fn.apply(obj1 ...

  6. JavaScript中bind的用法

    在JavaScript中,bind()方法用于创建一个新函数,该函数在调用时将其this关键字设置为提供的值,并将其作为参数传递给bind()方法.这是一种常见的技术,通常用于在事件处理程序中更改函数 ...

  7. Boost C++ 库

    http://zh.highscore.de/cpp/boost/frontpage.html Boost C++ 库 目录 第 1 章 简介 第 2 章 智能指针 第 3 章 函数对象 第 4 章  ...

  8. linux怎么删除代码库,是否有从代码库中删除第三方C和C库的好技巧或工具? (OS X或Linux)...

    我正在减少和隔离我对某些库的使用.我编写的许多现有程序直接使用这些库.我想要编译器(在这种情况下是GCC和/或Clang)或一些工具来帮助我识别我的代码库中的这些用法.简而言之,我想在代码库中毒害这些 ...

  9. 【Boost】boost库中function和bind一起使用的技巧(二)

    与 Boost.Function 一起使用 Boost.Bind 当我们把 Boost.Function 与某个支持参数绑定的库结合起来使用时,事情变得更为有趣.Boost.Bind 为普通函数.成员 ...

最新文章

  1. 自动写作、RNN基本原理以及LSTM的基本原理
  2. Python---已知Person类,继承Person类生成Teacher类(增加参数:科目)和Student类(增加参数:专业)。
  3. 明天 | 2021单细胞组学国际研讨会(线上)【附直播链接】
  4. 3 SD配置-企业结构-定义-定义产品组
  5. OpenCV计算机视觉实战(Python版)_006边缘检测
  6. GCD Timer事件的精度
  7. leetcode之移动零
  8. Windows环境下log4cxx的编译及使用(转载)
  9. spring html导出excel文件,springboot2.1.8使用poi导出数据生成excel(.xlsx)文件
  10. java--cmd乱码
  11. python库-collections模块Counter类
  12. SVN Working copying #39;xxxxx/xxxx/xxxx#39; locked
  13. oracle量子,中国科学院量子信息重点实验室
  14. USB鼠标驱动开发流程
  15. 蓝牙耳机播放声音前几秒听不到
  16. VLC介绍以及库的使用
  17. 微信小程序源代码_社区论坛功能实现
  18. 什么是GeoTrust?
  19. java的包装类型是什么用_Java基本类型和包装类型的区别
  20. java发送chunked数据_如何从java servlet中的chunked响应中发送Http预告片/页脚?

热门文章

  1. 算术运算符_加号的多种用法
  2. 常用的函数式接口_Predicate接口_默认方法and
  3. JDK7和JDK9流中异常的处理
  4. Response_功能介绍
  5. 如何判断对象是否存活之根搜索算法
  6. linux zip 开源工程,7-Zip 18.06 发布,开源数据压缩程序
  7. 【OOP】零钱通项目
  8. mysql的主键有什么作用_mysql设置主键有什么用
  9. 手机照片导入电脑步骤_怎样把手机里的照片传到电脑里
  10. React 和 Vue的特点