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 }