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的第二参数绑定。



原创粉丝点击