1.函数模版
1.写法与作用
template<class T>
T add(T a, T b)
{return a + b;
}
模版本质是为了适应指定类型,而不用写多个函数重载完成同一功能。
这个加法函数就可以适应int、double等类型的加法。
2.推导实例化
//推导实例化
int a = 0, b = 0;
double c = 3.0, d = 4.0;
int e = add(a, b);
double f = add(c, d);
在这里模版函数会识别实参的类型来推导那个T类型是什么类型。
3.显式实例化
//显式实例化
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.类模版
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; // intst1.Push(1);st1.Push(2);st1.Push(3);Stack<double> st2; // doublest2.Push(1.1);st2.Push(1.1);st2.Push(1.1);Stack<double>* pst = new Stack<double>;//...delete pst;return 0;
}