类模板与函数模板包装器
函数包装器:
1 /* 函数包装器 */
2
3 #include<iostream>
4
5 using namespace std;
6
7 // T 代表任何数据 F代表任何操作(可以是函数,函数模板的一个实例化)
8 template <typename T,typename F>
9 T run(T t,F f)
10 {
11 return f(t);
12 }
13
14 int add(int num)
15 {
16 return num+10;
17 }
18
19 template <typename T>
20 T add(T t)
21 {
22 return t+10;
23 }
24
25
26
27 void main()
28 {
29 cout << run(100,add) << endl;
30
31 cout << run(10.9,add<double>) << endl;
32
33 cin.get();
34 }
类包装器:
1 /* 类包装器 */
2
3 #include<iostream>
4
5 using namespace std;
6
7 // T 代表任何数据
8 // F代表任何操作(可以是函数,函数模板的一个实例化,类的成员函数)
9 // F如果是类的成员函数
10 // 类包装器可以处理类模板 ,处理类
11 template <typename T,typename F>// run就是类包装器
12 T run(T t,F f)
13 {
14
15 return f(t);
16 }
17
18 class Fun
19 {
20 public:
21 int num;
22 Fun(int x):num(x)
23 {
24
25 }
26
27 // ()可以把对象名当作函数使用
28 int operator ()(int data)// 类的成员函数
29 {
30 cout << "operator" << endl;
31 return data-num;
32 }
33
34 };
35
36
37
38
39 void main()
40 {
41 Fun fun1(20);
42
43 // cout << fun1(40) << endl;
44
45 cout << run(100,fun1) << endl;
46
47 cin.get();
48 }
49
50 //-------------------------------------------------------------------
51
52 template<typename T>
53 class FunT
54 {
55 public:
56 T t;
57 FunT(T x)::t(x)
58 {
59
60 }
61
62 T operator ()(T data)
63 {
64 cout << "operator T" << endl;
65 return data-t;
66 }
67
68 };
69
70
71
72
73 void main()
74 {
75 FunT<double> funt(10.8);
76
77 cout << funt(20.8) << endl;// 10
78
79 cout << run(108.9,funt) << endl;
80
81
82 cin.get();
83 }
84
85 //-------------------------------------------------------------------
86
87 /* 非基本数据类型 */
88
89
90 #include<iostream>
91
92 using namespace std;
93
94 // T 代表任何数据
95 // F代表任何操作(可以是函数,函数模板的一个实例化,类的成员函数)
96 // F如果是类的成员函数
97 // 类包装器可以处理类模板 ,处理类
98 template <typename T,typename F>// run就是类包装器
99 T run(T t,F f)
100 {
101
102 return f(t);
103 }
104
105 // 类包装器必须一致 T可以是数据类型 指针类型
106
107 // typeid(num1).name RTTI 实时类型检测 获取数据类型;
108 // decltype(num1) num2; 自动获取对象的数据类型进行拷贝 创建
109 // template 可以用自动推理的数据类型decltype
110 // 类包装器必须一致 T 可以是数据类型 指针类型
111 // 如果是数据 都是数据 如果是指针都是指针
112 // 包装器接口,是固话流程让数据与操作的流程固话,数据与操作都不固话
113 // 百度的搜索 每次搜索创建一个线程 T t是搜索的数据 F f 是搜索的算法
114 // 重载() 可以吧对象当作函数来使用
115
116
117 template<typename T,int n>
118 class auto_point
119 {
120 public:
121 auto_point()
122 {
123 cout << typeid(T).name << "auto_point构造" << endl;
124 p = new T[n];// 分配内存
125 }
126
127 ~auto_point()
128 {
129 cout << typeid(T).name << "auto_point销毁" << endl;
130 }
131 public:
132 T *p;
133 };
134
135
136 template<typename F>
137 class freeall
138 {
139 public:
140 freeall()
141 {
142 cout << typeid(F).name << "freeall构造" << endl;
143 }
144
145 F *operator ()(F *p)// 释放内存
146 {
147 cout << typeid(F).name << "freeall销毁" << endl;
148 delete []p;
149 return nullptr;
150 }
151
152 };
153
154
155
156 void main()
157 {
158
159 auto num1 = 1.3;
160 cout << typeid(num1).name << endl;
161 decltype(num1) num2;
162 cout << typeid(num2).name << endl;
163
164
165 cin.get();
166 }
167
168
169 //-------------------------------------------------------------------
170
171
172 void main()
173 {
174 auto_point<decltype(10.9),10> p;// 模板的参数可以是自动推理
175
176 //int *p = new int[10];
177 //delete []p;// 自动推理数据类型
178
179 cin.get();
180 }
181
182 //-------------------------------------------------------------------
183
184 class myclass
185 {
186 public:
187 myclass()
188 {
189 cout << "myclass构造" << endl;
190 }
191
192 ~myclass()
193 {
194 cout << "myclass销毁" << endl;
195 }
196 };
197
198 void main()
199 {
200 myclass my1;
201 auto_point<decltype(my1),3> auto1;// 根据自动推理实现调用模板
202
203
204 freeall<decltype(my1)> freeX;// 自动推理实现模板构建
205 run(auto1.p,freeX);
206
207
208 cin.get();
209 }
长风破浪会有时,直挂云帆济沧海
posted on 2015-06-11 15:06 Dragon-wuxl 阅读(288) 评论(0) 收藏 举报
浙公网安备 33010602011771号