#include


 

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::_1
31     //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);//100
39 
40     func2(10, 20);//30
41 
42     func3(10, 20, 30);//60
43 
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.8
58 
59     std::cout << run(db, fun2) << std::endl;
60 
61     std::cout << run(num1, num2, fun3) << std::endl;//48
62 
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;//551
34 
35     system("pause");
36 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM