模板
本质上来说,模板就是将类型参数化以解决强类型语言的严格性和灵活性的冲突。当然这一问题的解决还有两种方法,分别为带参数宏定义和重载函数。
其中普通函数与函数模板可以重载,而且函数模板之间也可以重载。模板一般不进行分文件编写,可就在头文件中实现,头文件后缀为.hpp。
模板可分为函数模板和类模板,通过模板实例化构造出具体的函数和类称为模板函数和模板类。
普通函数优先于模板函数的执行。
模板形参的设置
- 类型参数
- 非类型参数:常量表达式,整形数据
模板的实例化
- 显式实例化
- 隐式实例化
可变模板参数
可变模板参数是C++11新增的最强大特性之一,它对参数进行了高度泛化,能表示任意个参数。
参数包
①模板参数包 template<class…ARGS>class Tuple,ARGS被称为模板参数包,表示可以接收任意多个参数作为模板参数,编译器将多个模板参数打包成单个模板参数包
②函数参数包 template<class…T> void func(T…args);args称为函数参数包,表示该函数可以接收多个任意类型的参数
C++11要求参数包必须唯一,且为最后一个参数;当声明一个变量为可变参数时,省略号在该变量的左边;当使用参数包时,省略号位于参数包的左侧,表示立即展开该可变参数,此过程也被称为解包
模板实现队列
#pragma once
#include <iostream>
using namespace std;
template<class T>
class Queue
{
private:
T *_arr;//底层数组
int _size;
int _front;
int _rear;//头尾指针
public:
Queue(int n);
~Queue();
void push(T);
void pop();
bool isFull();
bool isEmpty();
T getFront();
T getRear();
void print();
};
template<class T>
Queue<T>::Queue(int n)
:_arr(new T[n+1]())
,_size(n+1)
,_front(0)
,_rear(0)
{
cout << "Queue(int n)" << endl;
}
template<class T>
Queue<T>::~Queue()
{
if(_arr)
delete []_arr;
cout << "~Queue()" << endl;
}
template<class T>
bool Queue<T>::isEmpty()
{
return _front == _rear;
}
template<class T>
bool Queue<T>::isFull()
{
return (_rear+1)%_size == (_front);
}
template<class T>
void Queue<T>::push(T n)
<