目录
🌏泛型编程
看下面一个例子,实现不同类型的两数交换:
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
🌏函数模板
交换两数的函数模板可以写出如下:
template<class T> // typename
void Swap(T& left, T& right)
{
T tmp = left;
left = right;
right = tmp;
}
🍯原理
🍯模板的实例化
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。
template<class T>
T Add(T a, T b)
{
return a + b;
}
- 隐式实例化
int main()
{
int a1 = 10, b1 = 20;
double a2 = 10.0, b2 = 20.0;
// 隐式实例化:让编译器根据实参推演模板参数的类型
Add(a1, b1);
Add(a2, b2);
// Add(a1,b2) error Add(a1,(int)b2) true
// 显式实例化
Add<int>(a1, b1);
return 0;
}
- 显示实例化
int main()
{
int a1 = 10, b1 = 20;
// 显式实例化:在函数名后加<>直接指明实际类型
Add<int>(a1, b1);
return 0;
}
🍯模板参数匹配原则
- 一个非模板函数与一个同名函数模板同时存在 正常调用时调用前者,因为编译器不用处理模板 , 指定调用时调用后者
template<class T>
T Add(T a, T b)
{
return a + b;
}
int Add(int a, int b)
{
return a + b;
}
int main()
{
Add(10, 20);// 直接调用同名函数,不需要用模板推演
Add<int>(10, 20);// 指定调用模板
return 0;
}
- 条件相同,调用前者,后者如果可以实例化出具有更好匹配的函数,选择后者
- 模板函数不允许自动类型转换
🌏类模板
// 类模板 类型是Vector<存储数据类型> 例如存储的是整形,那么类型就是Vector<int>
template<class T>
class Vector
{
public:
Vector(size_t capcaity = 4)
:_p(new T[_capcaity])
,_size(0)
,_capasity(capacity)
{}
~Vector()
{
delete[] _p;
_p = nullptr;
_size = _capcaity = 0;
}
private:
size_t _capcaity;
size_t _size;
T* _p;
};
🌐总结
以上就是模板初阶的一些内容,在后面的博客还会提到模板进阶的内容。接下来,我会持续更新C++中STL的一些容器的知识,喜欢的话,欢迎点赞支持~