C++ STL(三)模板

模板:实现代码重用的一种方式,通过类型参数化,把类型定义为参数

C++模板分为:函数模板与类模板

函数模板:

定义个通用的函数,函数返回值类型和形参类型用虚拟的类型来代表. 当调用函数时系统会根据实参的类型来取代模板中的虚拟类型,从而实现不同的函数功能.

函数模板定义形式

Template<typename T1,  typename T2>

类型名 函数名(形式参数表)

{

     ..........

}

1 //函数模板
2 template<typename T>
3 //取二个数中最大的数并且返回最大数
4 T GetMax(T a, T b)
5 {
6     return a>b ? a:b;
7 }

函数模板调用

显示调用: 模板函数名<类型名>(实参列表)

自动类型推导调用: 模板函数名(实参列表)

二者区别在于,前者调用时需要显示指明模板函数中虚拟类型的数据类型,后者由系统自动根据实参的类型进行转换

1 float fMax = GetMax<float>(0.5f,1.25f); //显示类型调用 fMax = 1.25f
2 int nMax = GetMax(3,6);                 //自动类型推导调用,nMax = 6

类模板:

和函数模板使用上差别不大,不同在于类模板是个类,当有多个类在功能上相同,仅仅是类中数据类型不同时就可以使用类模板,减少编写多个相同功能的类

函数模板定义形式

Template<class T1, class T2>

class 类名

{

     ..........

}

 1 template<class TT>
 2 class CMax
 3 {
 4 public:
 5     CMax(){}
 6     CMax(TT a, TT b) : m_a(a), m_b(b){}
 7     TT GetMax()
 8     {
 9         return m_a>m_b ? m_a:m_b;
10     }
11     void SetValue(TT a, TT b);
12 private:
13     TT m_a;
14     TT m_b;
15 };
16 //注意:类外定义成员函数还需要声明一次类模板
17 template<class TT>
18 void CMax<TT>::SetValue(TT a, TT b)
19 {
20     m_a = a;
21     m_b = b;
22 }

类模板使用

实例化类模板对象时,不能使用类型自动推导,必须显示指明虚拟类型的数据类型

 1     //实例化个CMax类模板对象,显示指明类中的虚拟类型为int
 2     //Cmax模板类中所有TT类型都会自动转换为int型
 3     CMax<int> maxA(3,6);   
 4     int nMaxA = maxA.GetMax();  //nMaxA = 6
 5 
 6     CMax<float> maxB(1.25f,1.2f);
 7     float fMaxB = maxB.GetMax(); //fMaxB = 1.25f
 8     CMax<char> maxC('a','g');
 9     char cMaxB = maxC.GetMax();  //cMaxB = 'g'
10     CMax<int> maxD;
11     maxD.SetValue(10,5);
12     int nMaxdD = maxD.GetMax(); //nMaxD = 10
13 
14     return 0;
原文地址:https://www.cnblogs.com/fzxiaoyi/p/12091733.html