c++ functional頭文件 std::用法
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 }