C++ Template是一个广泛使用的功能。通过使用C++ Template,我们可以通过相同的逻辑去处理不同的类型数据。Template同样也是一种高度代码重用的方式。你可能没有亲自写过一个模板的代码,但是你可能已经体验过他的威力。因为我们经常使用的STL就是通过模板来实现的。我们常用的一些容器类,比如vector, set之类的,都是通过一套代码,来实现了对各种数据类型的支持。这些数据类型除了系统本身支持的,比如int, char之类的,同样也包括你自己定义的数据类型。所以说,你应该非常熟练的掌握这个功能。
在C++里,Template主要通过两种方式应用:
- 模板函数
- 模板类
模板函数很好理解。下面的代码显示了如何定义一个模板函数,以及如何去使用它。你如果仔细观察下面的例子的话就会发现,在模板函数的调用上,和其他普通函数没有任何区别。只不过你需要在定义的时候,需要定义一个template<class T>。 这里的T就是你即将调用的数据类型。
1 #include "stdafx.h"
2 #include <iostream>
3
4 template<class T>
5 T Add(T a, T b)
6 {
7 return a + b;
8 }
9
10 int _tmain(int argc, _TCHAR* argv[])
11 {
12 std::cout<<Add(1, 2)<<std::endl;
13
14 std::cout<<Add(1.2, 2.2)<<std::endl;
15
16 return 0;
17 }
模板类的定义和普通的类有些区别。和模板函数类似,你需要在开头定义一个T。
1 template<class T>
2 class AutoPtr
3 {
4 public:
5 explicit AutoPtr(T * p):m_pointer(p){}
6 ~AutoPtr(){ delete m_pointer;}
7 private:
8 T * m_pointer;
9 };
10
11 int _tmain(int argc, _TCHAR* argv[])
12 {
13 int * p = new int[20];
14 AutoPtr<int> pAutoPtr(p);
15
16 return 0;
17 }
对于模板类,还有另外一种定义方法。你可以定义成员函数作为模板函数,而类不需要是模板类。
1 class Math
2 {
3 public:
4 template<class T>
5 T Add(T a, T b) {return a+b;}
6 };
7
8 int _tmain(int argc, _TCHAR* argv[])
9 {
10 Math math;
11 std::cout<<math.Add(1, 2)<<std::endl;
12
13 return 0;
14 }
通过上面三个例子,我们了解了模板的两种用法。这样,在我们以后的代码生涯中,我们又多了一件武器。