【C++】bind参数绑定 P354(通用的函数适配器)
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(通用的函数适配器)相关推荐
- 参数绑定---bind函数
引言 对于那种只在一两个地方使用的简单操作,lambda表达式是最有用的. 如果我们需要在很多地方使用相同的操作,通常应该定义一个函数,而不是多次编写相同的lambda表达式. 类似的,如果一个操作需 ...
- C++11 lambda表达式、function类模板、bind函数适配器
文章目录 lambda表达式 lambda表达式的语法 lambda表达式的原理 function模板 function与重载函数 bind函数适配器 lambda表达式 当我们在写代码的时候如果经常 ...
- 泛型算法(lambda表达式、function类模板、bind函数适配器、迭代器类别、链表数据结构独有的算法)
文章目录 概念 find()函数 迭代器令算法不依赖于容器 但算法依赖于元素类型的操作 算法永远不会执行容器的操作 只读算法 accumulate()函数 从两个序列中读取元素(equal函数为例) ...
- C++11 参数绑定-bind函数用法
lambda表达式:https://blog.csdn.net/readyone/article/details/110874546 https://blog.csdn.net/readyone/ar ...
- C++使用boost::bind 订阅消息中的返回函数传入多个参数
最近读别人的代码,看到了一个有意思的东西. 主要是当我们订阅一个消息时候,会调用一个返回函数. 例如: ros::Subscriber scan_sub=n.subscribe<std_msgs ...
- html绑定带有形参的函数,Python中函数参数类型和参数绑定
参数类型 Python函数的参数类型一共有五种,分别是: POSITIONAL_OR_KEYWORD(位置参数或关键字参数) VAR_POSITIONAL(可变参数) KEYWORD_ONLY(关键字 ...
- c++11 bind直接绑定未初始化类的成员函数、类对象的operater()的方法与区别
针对标题的两种情况,使用起来有一定的特殊性,特此记录下. 至于其他常规的bind使用方法,网上有很多文章有介绍,也可以看这篇文章. 标题的两种情况: 情况一: 这个例子用了两个知识: 第一,关于std ...
- 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )
文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...
- Boost:bind绑定__cdecl(成员函数)测试程序
Boost:bind绑定__cdecl(成员函数)测试程序 实现功能 C++实现代码 实现功能 bind绑定__cdecl(成员函数)测试程序 C++实现代码 #include <boost/c ...
最新文章
- mysql物理文件组成
- jmeter 线程执行顺序_面试官让我说出8种线程顺序执行的方法!我懵了
- win10系统打开更新服务器失败怎么回事,Win10系统一直无法安装更新怎么办 Win10更新一直安装失败的3种解决方法...
- 不一样的STAR法则
- php中empty功能,在php中empty函数起什么作用呢?
- OpenSSL(加密方式,加密算法,自签证书)
- CodeForces - 353E Antichain(贪心+思维)
- oracle代码实例,oracle存储过程代码实例
- 华为服务器型号2285,华为服务器2285磁盘阵列设置
- 这就是数据分析之数据采集
- python好用的内置库_第42p,time库,Python中优秀的内置库
- 中国甲腈行业市场供需与战略研究报告
- Top 100 good english words
- Apache Mina的用法
- Idea中@Autowired 黄色波浪线问题,注入类显示红色波浪线,去除重复代码导致的波浪黄线,去除xml文件里sql语句的黄色行背景色,问题解决
- 【元胞自动机】基于matlab元胞自动机人流疏散【含Matlab源码 665期】
- OneDrive网盘资源下载教程
- dell服务器开机自动进入bios设置,戴尔服务器不能进入BIOS的解决方案
- 手撸架构,MyBatis 面试42问
- 中文邮件格式模板、工作汇报邮件模板这样写,90%人都爱看
热门文章
- centos下mysql常用的三种备份方法_centos下mysql自动备份(全量)
- dmmbus地址_dmmbus新地址是多少_动漫台
- 没有与参数列表匹配的 重载函数 getline 实例_面试题:方法重载的底层原理?...
- android不调用系统发送短信,android之两种方式调用短信发送接口
- 线性代数--矩阵、向量
- ROS系统——动态修改realsense相机参数方法
- easy-x库graphics.h图形库安装
- python场景建立_Python创建一个街道地址表-问答-阿里云开发者社区-阿里云
- sdk没有登录什么意思_不需要接入SDK的第三方登录及分享
- 有java基础的人学python_准备自学Python ,会java,有什么建议吗?