目录
一 泛型编程
1 概念:
在
C++
中,存在一种
模具
,通过给这个模具中
填充不同材料
(
类型
)
,来
获得不同材料的铸件
(
生成具体类型的代码
)
,那将会节省许多头发。巧的是前人早已将树栽好,我们只需在此乘凉。
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
二 函数模板
1 函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定
类型版本。
2 函数模板格式
2.1 template<typename T1, typename T2,......,typename Tn>
返回值类型 函数名
(
参数列表
){}
2.2
typename
是
用来定义模板参数
关键字
,
也可以使用
class(
切记:不能使用
struct
代替
class)
3 示例
#include<iostream>
#include<vector>
using namespace std;
//函数模板
template<class T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
//指定int类型
int Add(int& x1, int& x2)
{
return x1 = x2;
}
//泛用模板
template<class T1>
T1 Add(T1& x1, T1& x2)
{
return x1 + x2;
}
int main()
{
int a = 10, b = 20;
double c = 1.1, d = 5.7;
char e = 'x', f = 'y';
Swap(a, b);
Swap<double>(c, d); //函数模板显式实例化
Swap(c, d);//函数模板隐式实例化
Swap(e, f);
cout << Add(a, b) << endl; //调用指定int型的函数
cout << Add<int>(a, b) << endl;//调用函数模板
cout << Add(c,d) << endl;//调用函数模板
return 0;
}
三 类模板
1 类模板的定义格式
namespace zhang
{
//类模板
// Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{
public:
Vector(size_t capacity = 10)
: _pData(new T[capacity])
, _size(0)
, _capacity(capacity)
{}
// 使用析构函数演示:在类中声明,在类外定义。
~Vector();
size_t Size()
{
return _size;
}
T& operator[](size_t pos)
{
assert(pos < _size);
return _pData[pos];
}
private:
T* _pData;
size_t _size;
size_t _capacity;
};
}
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
zhang::Vector<T>::~Vector()
{
if (_pData)
{
delete[] _pData;
}
_size = _capacity = 0;
}
int main()
{
//类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>。
// 然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
zhang::Vector<int> s1;
zhang::Vector<double> s2;
return 0;
}