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;