类模板与函数模板包装器

 函数包装器:

 

 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)    收藏  举报

导航