#include <functional>

来源:互联网 发布:视频后期制作 mac 编辑:程序博客网 时间:2024/06/06 16:55

1 bind(引用内部函数, 实体对象的地址, 占位符); 

2 bind1st

3 function

 

1 auto 变量名 = bind(引用内部函数, 实体对象的地址, 占位符); 

 

复制代码
 1 #include <iostream> 2 #include <functional> 3 using namespace std; 4  5 //仿函数,创建一个函数指针,引用一个结构体内部或者一个类内部的public公有函数 6  7 struct MyStruct 8 { 9     void add1(int a)10     {11         std::cout << a << std::endl;12     }13 14     void add2(int a, int b)15     {16         std::cout << a + b << std::endl;17     }18 19     void add3(int a, int b, int c)20     {21         std::cout << a + b + c << std::endl;22     }23 };24 25 void main()26 {27     MyStruct struct1;//创建一个结构体变量28 29     //auto自动变量,地址,函数指针30     //对于参数要使用占位符 std::placeholders::_131     //auto 变量名 = bind(引用内部函数, 实体对象的地址, 占位符);32     auto func = bind(&MyStruct::add1, &struct1, std::placeholders::_1);33 34     auto func2 = bind(&MyStruct::add2, &struct1, std::placeholders::_1, std::placeholders::_2);35 36     auto func3 = bind(&MyStruct::add3, &struct1, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);37 38     func(100);//10039 40     func2(10, 20);//3041 42     func3(10, 20, 30);//6043 44     //创建一个函数指针,指向结构体内部的函数。由于结构体的数据是独有的,而函数是共享的,因此无法指向某个结构体变量的函数,只能指向结构体的函数45     //函数通过调用,调用需要传递对象名46     void(MyStruct::*p)(int) = &MyStruct::add1;//使用函数也可以解决,但是没有bind好用    47     48     system("pause");49 }
复制代码

 

2 bind1st

 

std::bind1st(std::greater<int>(), 3)

 

//bind1st绑定一个函数,greater也是函数,比大小

//作用:从头到尾,查找比3小的第一个元素

//用途,查找不及格的人

 

复制代码
 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5  6 int main() 7 { 8     std::vector<int>myvector; 9 10     myvector.push_back(11);11     myvector.push_back(2);12     myvector.push_back(16);13     myvector.push_back(1);14     myvector.push_back(18);15 16     auto ib = myvector.begin();17     auto ie = myvector.end();18 19     for (; ib != ie; ib++)20     {21         std::cout << *ib << std::endl;22     }23     std::cout << std::endl;24 25     auto ifind = find_if(myvector.begin(), myvector.end(), std::bind1st(std::greater<int>(), 3));//bind1st绑定一个函数,greater也是函数,比大小26     //作用:从头到尾,查找比3小的第一个元素27     //用途,查找不及格的人28 29     std::cout << *ifind << std::endl;30 31     return 0;32 }
复制代码

 

std::bind1st(std::greater<int>(), 3)

另外写一个函数实现

 

复制代码
 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5  6 bool less3(int x) 7 { 8     return x < 3; 9 }10 11 int main()12 {13     std::vector<int>myvector;14 15     myvector.push_back(11);16     myvector.push_back(2);17     myvector.push_back(16);18     myvector.push_back(1);19     myvector.push_back(18);20 21     auto ib = myvector.begin();22     auto ie = myvector.end();23 24     for (; ib != ie; ib++)25     {26         std::cout << *ib << std::endl;27     }28     std::cout << std::endl;29 30     auto ifind = find_if(myvector.begin(), myvector.end(), less3);//bind1st绑定一个函数,greater也是函数,比大小31     //作用:从头到尾,查找比3小的第一个元素32     //用途,查找不及格的人33 34     std::cout << *ifind << std::endl;35 36     return 0;37 }
复制代码

 

3 std::function

 

std::function实现函数包装器

 

std::function实现函数包装器

//第一,设计执行接口,接口可以设计关卡(收费,插入if...else)、计数器

//第二,函数包装器依赖于函数模板,实现通用泛型

//第三,函数代码可以内嵌在另外一个函数,实现函数怀孕

//第四,函数包装器可以用于管理内嵌函数和外部函数调用

 

函数包装器管理内嵌函数

 

复制代码
 1 #include <iostream> 2 #include <functional> 3 using namespace std; 4  5 //函数包装器 6 //第一,设计执行接口,接口可以设计关卡(收费,插入if...else)、计数器 7 //第二,函数包装器依赖于函数模板,实现通用泛型 8 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 9 //第四,函数包装器可以用于管理内嵌函数和外部函数调用10 11 //函数包装器,T是数据类型,F是函数12 template <typename T, typename F>13 T run(T v, F f)//第一个参数是数据,第二个参数是函数14 {15     static int count = 0;//计数器16     count++;17     std::cout << "一个参数的包装器 执行" << count << "" << std::endl;18     if (count > 1)//通过计数器,限定函数执行次数19     {20         T vx(0);21         return vx;22     }23 24     return f(v);//函数传入参数25 }26 27 template <typename T, typename F>28 T run(T v1, T v2, F f)//第一个参数是数据,第二个参数是数据,第三个参数是函数29 {30     return f(v1, v2);//函数传入参数31 }32 33 void main()34 {35     double db = 12.9;36     int num1 = 19;37     int num2 = 29;38 39     //    <返回值类型(参数类型)>40     //fun1是函数指针41     std::function <double(double)>fun1 = [](double u)42     {43         return u * 2;44     };45 46     std::function <double(double)>fun2 = [](double u)47     {48         return u*u;49     };50 51     //    <返回值类型(参数类型, 参数类型)>52     std::function <int(int, int)>fun3 = [](int u1, int u2)53     {54         return u1 + u2;55     };56 57     std::cout << run(db, fun1) << std::endl;//25.858 59     std::cout << run(db, fun2) << std::endl;60 61     std::cout << run(num1, num2, fun3) << std::endl;//4862 63     system("pause");64 }
复制代码

 

函数包装器管理外部函数

 

复制代码
 1 #include <iostream> 2 #include <functional> 3 using namespace std; 4  5 //函数包装器 6 //第一,设计执行接口,接口可以设计关卡(收费,插入if...else)、计数器 7 //第二,函数包装器依赖于函数模板,实现通用泛型 8 //第三,函数代码可以内嵌在另外一个函数,实现函数怀孕 9 //第四,函数包装器可以用于管理内嵌函数和外部函数调用10 11 //函数包装器,T是数据类型,F是函数12 template <typename T, typename F>13 T run(T v1, T v2, F f)//第一个参数是数据,第二个参数是数据,第三个参数是函数14 {15     return f(v1, v2);//函数传入参数16 }17 18 int cheng(int a, int b)//外部函数,实现乘法19 {20     return a*b;21 }22 23 void main()24 {25     double db = 12.9;26     int num1 = 19;27     int num2 = 29;28 29     //fun4是函数指针30     //    <函数返回值类型(参数类型, 参数类型)>31     std::function <int(int, int)>fun4 = cheng;32 33     std::cout << run(num1, num2, fun4) << std::endl;//55134 35     system("pause");36 }
原创粉丝点击