C++中模板又被称为泛型编程,模板分为函数模板和类模板。
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
格式:
template 返回值类型 函数名(参数列表){}
一般都写成:template
比如:
// 专门处理int的加法函数
int Add(int left, int right)
{
return left + right;
}
// 通用相同类型加法函数
template
T Add(const T& left, const T& right)
{
return left + right;
}
// 通用不同类型加法函数
template
T1 Add(const T1& left, const T2& right)
{
return left + right;
}
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
1. 隐式实例化:让编译器根据实参推演模板参数的实际类型
int a1 = 10, a2 = 20;
double d1 = 10.0, d2 = 20.0;
Add(a1, (int)d1);
2. 显式实例化:在函数名后的<>中指定模板参数的实际类型
Add
格式:
template
class 类模板名 {
// 类内成员定义
};
比如:
template
class Stack {
public:
Stack(int capacity = 4) {
_a = new T[capacity];
_top = 0;
_capacity = capacity;
}
~Stack() {
delete[] _a;
_capacity = _top = 0;
}
private:
T* _a;
size_t _top;
size_t _capacity;
};
由于构造函数参数不一定为模板类型,所以类模板只能显示实例化
Stack
Stack
如果觉得这篇文章对你有帮助可以收藏下来,也欢迎大家进行批评指正,理解模板可以帮助我们更好的编写程序,一起加油