1.函数模版
1.写法与作用
cpp
template<class T>
T add(T a, T b)
{
return a + b;
}
模版本质是为了适应指定类型,而不用写多个函数重载完成同一功能。
这个加法函数就可以适应int、double等类型的加法。
2.推导实例化
cpp
//推导实例化
int a = 0, b = 0;
double c = 3.0, d = 4.0;
int e = add(a, b);
double f = add(c, d);
在这里模版函数会识别实参的类型来推导那个T类型是什么类型。
3.显式实例化
cpp
//显式实例化
int a = 0, b = 0;
double c = 3.0, d = 4.0;
//指定T类型为int类型
int e = add<int>(a, b);
//指定T类型为double类型
double f = add<double>(c, d);
2.类模版
cpp
template<class T>
class Stack
{
public:
//实现了可以用栈存储不同类型的数据的功能
Stack(int n = 4)
:_array(new T[n])
,_size(0)
,_capacity(n)
{}
~Stack()
{
delete[] _array;
_array = nullptr;
_size = _capacity = 0;
}
void Push(const T& x);
private:
T* _array;
size_t _capacity;
size_t _size;
};
//声明与定义分离,需要指定类域与类模版
template<class T>
void Stack<T>::Push(const T& x)//用引用减少拷贝构造,提高效率
{
if (_size == _capacity)
{
T* tmp = new T[_capacity * 2];
memcpy(tmp, _array, sizeof(T) * _size);
delete[] _array;
_array = tmp;
_capacity *= 2;
}
_array[_size++] = x;
}
int main()
{
// 类模板都是显示实例化
Stack<int> st1; // int
st1.Push(1);
st1.Push(2);
st1.Push(3);
Stack<double> st2; // double
st2.Push(1.1);
st2.Push(1.1);
st2.Push(1.1);
Stack<double>* pst = new Stack<double>;
//...
delete pst;
return 0;
}