27 新型适配器bind的使用方法(学自Boolean)
来源:互联网 发布:易语言进销存软件 编辑:程序博客网 时间:2024/05/16 08:35
1、概述
上一篇已经介绍G2.9中的能进行参数绑定的适配器bind2nd(绑定第二参数),当然也有绑定第一参数(bind1nd)。而在新版的编译器中有一个新型的绑定适配器bind,下面主要用示例进行介绍其用法。
2、bind的使用方法示例
1)头文件数据
#include <iostream>using namespace std;#include <functional>using namespace std::placeholders;#include <vector>#include <algorithm>double my_divide(double x, double y){return x / y;}//#1struct MyPair{double a, b;double multiply(){ return a*b; }};//#2解析:
a、在使用bind()用法前,先在头文件先引出functional,然后预先声明std::placeholders,它的作用是进行占位(符号:_1,_2),具体解释见下例子。
b、因std::bind可以绑定:functions(一般函数)、function objects(仿函数)、member_functions(成员函数)和data_members(类成员)。故声明了#1和#2一个函数和一个类,类中有类数据和类成员函数。#1作用是除法,#2作用是乘法。
2)主程序测试
int _tmain(int argc, _TCHAR* argv[]){auto fn_five = bind(my_divide, 10, 2); //#3 return 10 / 2 cout << fn_five() << endl; //5auto fn_half = bind(my_divide, _1, 2); //#4 return 10 / 2 cout << fn_half(10) << endl; //5auto fn_invert = bind(my_divide, _2, _1); //#5 return 2 / 10cout << fn_invert(10, 2) << endl; //0.2auto fn_rounding = bind<int>(my_divide, _1, _2); //#6 return int(10 / 3)cout << fn_rounding(10, 3) << endl; //3//binding memberMyPair ten_two{ 10, 2 };auto bound_memfun = bind(&MyPair::multiply, _1); //#7 return x.multiply()cout << bound_memfun(ten_two) << endl; // 20auto bound_memdata = bind(&MyPair::a, ten_two); //#8 return ten_two.acout << bound_memdata() << endl; //10auto bound_memdata2 = bind(&MyPair::b, _1); //#9 return x.bcout << bound_memdata2(ten_two) << endl; //2vector<int> v{ 15, 37, 94, 50, 73, 58, 28, 98 };int n = count_if(v.cbegin(), v.cend(), not1(bind2nd(less<int>(), 50)));cout << n << endl; //5auto fn = bind(less<int>(), _1, 50); //#10cout << count_if(v.cbegin(), v.cend(), fn) << endl; //3return 0;}解析:
a、#3通过bind绑定一般函数my_divide()传入函数的第一参数为10,第二参数为2,则通过结果fn_five()即可实现10// 2 = 5操作;
b、#4通过bind绑定一般函数my_divide()传入函数的第二参数为2,第一参数用符号_1表示第一参数未被绑定,则通过fn_half(10)将第一参数传入计算;
c、#5通过bind绑定一般函数my_divide(),而符号_2,_1表示绑定后要传入第二参数和第一参数,则通过fn_invert(10,2)分别将第二和第一参数传入计算;
d、#6通过bind绑定一般函数my_divider(),同时返回类型也指定是int,而通过符号_1,_2表示要传入第一参数和第二参数,则通过fn_rounding(10,2)传入计算;
e、#7通过bind绑定成员函数multiply(),而符号_1表示函数参数未传入,要要把声明对象数据传入,及bound_memfun(ten_two)计算;
f、#8通过bind绑定类成员a,且类数据ten_two已经传入,使用时直接用bound_memdata()进行计算;
f、#9通过bind绑定类成员b,且符号_1表示类数据未传入,需要使用bound_memdata2(ten_two)将数据传入计算;
g、#10通过bind绑定仿函数less<int>(),且将仿函数的第二参数传入50,第一参数采用符号_1表示要实际传入,则fn才能实现less的第二参数绑定。
- 27 新型适配器bind的使用方法(学自Boolean)
- 26 函数适配器binder2nd(学自Boolean)
- 28 迭代器适配器(学自Boolean)
- 29 x适配器ostream_iterator和istream_iterator(学自Boolean)
- 09 C++Reference引用的用法(学自Boolean)
- 19 迭代器iterator的设计原则(学自Boolean)
- 20 容器vector的深度探索(学自Boolean)
- 24 迭代器分类对算法的影响(学自Boolean)
- 30 hash function(学自Boolean)
- view的boolean onKeyDown()使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- boost::bind的使用方法
- 20171211-RegExp转义符
- ConstraintLayout使用解析并去掉ConstraintLayout的默认布局方式
- hive数据类型和文件格式
- 语音视频社交背后技术深度解析
- 洛谷 P1072 Hankson 的趣味题
- 27 新型适配器bind的使用方法(学自Boolean)
- 汉诺塔问题hanoi
- 如何解决苹果审核4.3问题(guideline4.3, 马甲包4.3, 马甲包混淆)
- VisualSVN server下载安装
- 尬
- Java枚举实现接口
- WORDPRESS安装趟坑之旅
- python环境下安装matplotlib
- 如何通过计算信息熵,进行决策树的分裂