1. 什么时候该使用bing ?什么时候该使用lambda?

  • 当只有少数地方调用时候使用lambda,当需要多次调用lambda时,需要定义一个函数,而不是多次编译相同的lambda表达式。

    调用bind的一般形式为:
    auto newCallable = bind(callable,arg_list)
    callable本身是一个可调用的对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即当调用newCallable时,newCallable会调用callable,并传递给arg_list中的参数。
    
    arg_list中的参数可能包含形如 _n 的名字,其中 n是一个整数。这些参数是“占位符”,表示newCallable的参数,它们占据了传递给newCallable的参数的“位置”。
    数值 n 表示生成的可调用对象中参数的位置: _1 为newCallable的第一个参数,_2为newCallable的第二个参数,依次类推。
    

    2.实例

    demo1: bind的使用实例

        bool check_size(const string& s, string::size_type sz) {return s.size() >= sz;}string s = "hello";auto check6 = bind(check_size, std::placeholders::_1, 6);bool b1 = check6(s);    std::cout << b1 << std::endl;
    

    demo2: for_each find_if stable_sort使用实例

    vector<string> wordVec = { "the","quick","red","fox","jnmp","slow","over","the","red" };//the red fox the red jnmp slow over quickstable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });vector<string>::size_type sz = 4;auto wc = find_if(wordVec.begin(), wordVec.end(),[sz](const string& a){return a.size() >= sz; });// jump std::cout << *wc << std::endl;// jnmp slow over quickauto count = wordVec.end() - wc;for_each(wc, wordVec.end(), [](const string& s) { cout << s << " "; });
    

    demo 3:通过bind 实现find_if调用check_size适配实现

       auto wc = find_if(wordVec.begin(), wordVec.end(),bind(check_size,std::placeholders::_1,sz));
    

    3. bind 参数:bind绑定可调用对象中参数或将其重新排序

    // g 是一个有2个参数的可调用对象,f是一个可调用对象,他有5个参数
    auto g = bind(f,a,b,_2,c,_1);
    如上,生成一个新的可调用对象,它有2个参数,对别使用占位符 _2 和 _1表示,这个新的可调用对象将自己的参数作为第三个和第五个传递给f。f的第一个、第二个和第四个数参数分别绑定到给定的值 a,b,c上
    
    传递给g的参数按位置绑定到占位符。即第一个参数绑定到_1,第二个参数绑定到_2。
    
    当调用g时,其第一个参数将被传递给f作为最后一个参数,第二个参数将被传递给f作为第三个参数
    
    实际上,这个bind调用会将  g(_1,_2) 映射为 f(a,b,_2,c,_1)
    即对g的调用会调用f,用g的参数代替占位符,再加上绑定的参数a,b,c。
    
    例如: 调用g(X,Y) 映射为 f(a,b,Y,c,X)
    

    4. 用bind重排参数顺序

    • 通用写法

      bool isShorter(const string& s1, const string& s2) {return s1.size() < s2.size();
      }
      
    • lambda写法

      stable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });
      
    • bind 写法,由短至长排序

      sort(wordVec.begin(), wordVec.end(), isShorter);
      
    • bind写法,由长至短排序

      std::stable_sort(wordVec.begin(), wordVec.end(), std::bind(isShorter,std::placeholders::_2, std::placeholders::_1));
      

    5. 绑定引用参数

    • 5.1 默认情况下,bind那些不是占位符的参数,被拷贝到bind返回的可调用对象当中。,有时对有些绑定的参数可以采用引用的方式,或者要绑定参数的类型无法拷贝。

      错误实例:os不能拷贝,原因在于bind拷贝其参数,bind不能直接拷贝ostream对象

      for_each(a.begin(),a.end(),bind(print,os,_1,' '));
      

      标准库ref函数,可以实现bind传递一个对象而不拷贝该对象

      for_each(a.begin(),a.end(),bind(print,ref(os),_1,' '));
      

      函数ref返回一个对象,包含给定的引用,此对象是可以拷贝的。

    • 5.2 demo2 RemapPointsInternal计算实例

        if (configuration_->threads() > 1) {tbb::parallel_for((size_t) 0,(size_t) point_centers_remapped.size(),(size_t) 1,std::bind(&Remapper::RemapPointsInternal,this,std::ref(point_centers_remapped),std::ref(point_centers),std::ref(in_out_img_extended_flag),std::ref(in_out_img_origin_flag),std::cref(forword_map_x),std::cref(forword_map_y),x_offset,y_offset,temperature_ntc,std::cref(calib_params),std::placeholders::_1));} else {for (size_t i = 0; i < point_centers_remapped.size(); ++i) {RemapPointsInternal(point_centers_remapped,point_centers,in_out_img_extended_flag,in_out_img_origin_flag,forword_map_x,forword_map_y,x_offset,y_offset,temperature_ntc,calib_params,i);}}
      
    • 5.3 demo3 描述子计算实例ComputeDescriptorsInternal

       if (configuration_->threads() > 1) {tbb::parallel_for((size_t) 0,(size_t) points.size(),(size_t) 1,std::bind(&DescriptorGenerator::ComputeDescriptorsInternal<PointType>,this,std::ref(points),std::ref(descriptors),std::ref(point_centers_remap),std::ref(bit_descriptors),std::ref(point_center_image),search_offsets_fxp,search_angle,coarse_quadrant,std::placeholders::_1));} else {for (size_t i = 0; i < points.size(); ++i)ComputeDescriptorsInternal(points,descriptors,point_centers_remap,bit_descriptors,point_center_image,search_offsets_fxp,search_angle,coarse_quadrant,i);}
      

    使用placeholders名字

  • 1.通过 using 语句,而不是分别声明每个占位符 格式如下

    using namespace namespace_name
    

    实例:

    using namespace std::placeholders;
    
    / PLACEHOLDER ARGUMENTS
    namespace placeholders {_INLINE_VAR constexpr _Ph<1> _1{};_INLINE_VAR constexpr _Ph<2> _2{};_INLINE_VAR constexpr _Ph<3> _3{};_INLINE_VAR constexpr _Ph<4> _4{};_INLINE_VAR constexpr _Ph<5> _5{};........._INLINE_VAR constexpr _Ph<17> _17{};_INLINE_VAR constexpr _Ph<18> _18{};_INLINE_VAR constexpr _Ph<19> _19{};_INLINE_VAR constexpr _Ph<20> _20{};
    } // namespace placeholders
    

【C++】bind参数绑定 P354(通用的函数适配器)相关推荐

  1. 参数绑定---bind函数

    引言 对于那种只在一两个地方使用的简单操作,lambda表达式是最有用的. 如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式. 类似的,如果一个操作需 ...

  2. C++11 lambda表达式、function类模板、bind函数适配器

    文章目录 lambda表达式 lambda表达式的语法 lambda表达式的原理 function模板 function与重载函数 bind函数适配器 lambda表达式 当我们在写代码的时候如果经常 ...

  3. 泛型算法(lambda表达式、function类模板、bind函数适配器、迭代器类别、链表数据结构独有的算法)

    文章目录 概念 find()函数 迭代器令算法不依赖于容器 但算法依赖于元素类型的操作 算法永远不会执行容器的操作 只读算法 accumulate()函数 从两个序列中读取元素(equal函数为例) ...

  4. C++11 参数绑定-bind函数用法

    lambda表达式:https://blog.csdn.net/readyone/article/details/110874546 https://blog.csdn.net/readyone/ar ...

  5. C++使用boost::bind 订阅消息中的返回函数传入多个参数

    最近读别人的代码,看到了一个有意思的东西. 主要是当我们订阅一个消息时候,会调用一个返回函数. 例如: ros::Subscriber scan_sub=n.subscribe<std_msgs ...

  6. html绑定带有形参的函数,Python中函数参数类型和参数绑定

    参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...

  7. c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别

    针对标题的两种情况,使用起来有一定的特殊性,特此记录下. 至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章. 标题的两种情况: 情况一: 这个例子用了两个知识: 第一,关于std ...

  8. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

    文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...

  9. Boost:bind绑定__cdecl(成员函数)测试程序

    Boost:bind绑定__cdecl(成员函数)测试程序 实现功能 C++实现代码 实现功能 bind绑定__cdecl(成员函数)测试程序 C++实现代码 #include <boost/c ...

最新文章

  1. mysql物理文件组成
  2. jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了
  3. win10系统打开更新服务器失败怎么回事,Win10系统一直无法安装更新怎么办 Win10更新一直安装失败的3种解决方法...
  4. 不一样的STAR法则
  5. php中empty功能,在php中empty函数起什么作用呢?
  6. OpenSSL(加密方式,加密算法,自签证书)
  7. CodeForces - 353E Antichain(贪心+思维)
  8. oracle代码实例,oracle存储过程代码实例
  9. 华为服务器型号2285,华为服务器2285磁盘阵列设置
  10. 这就是数据分析之数据采集
  11. python好用的内置库_第42p,time库,Python中优秀的内置库
  12. 中国甲腈行业市场供需与战略研究报告
  13. Top 100 good english words
  14. Apache Mina的用法
  15. Idea中@Autowired 黄色波浪线问题,注入类显示红色波浪线,去除重复代码导致的波浪黄线,去除xml文件里sql语句的黄色行背景色,问题解决
  16. 【元胞自动机】基于matlab元胞自动机人流疏散【含Matlab源码 665期】
  17. OneDrive网盘资源下载教程
  18. dell服务器开机自动进入bios设置,戴尔服务器不能进入BIOS的解决方案
  19. 手撸架构,MyBatis 面试42问
  20. 中文邮件格式模板、工作汇报邮件模板这样写,90%人都爱看

热门文章

  1. centos下mysql常用的三种备份方法_centos下mysql自动备份(全量)
  2. dmmbus地址_dmmbus新地址是多少_动漫台
  3. 没有与参数列表匹配的 重载函数 getline 实例_面试题:方法重载的底层原理?...
  4. android不调用系统发送短信,android之两种方式调用短信发送接口
  5. 线性代数--矩阵、向量
  6. ROS系统——动态修改realsense相机参数方法
  7. easy-x库graphics.h图形库安装
  8. python场景建立_Python创建一个街道地址表-问答-阿里云开发者社区-阿里云
  9. sdk没有登录什么意思_不需要接入SDK的第三方登录及分享
  10. 有java基础的人学python_准备自学Python ,会java,有什么建议吗?