在C++中,模板主要分为两种:
(1)函数模板:
允许你定义一个通用的函数,这个函数可以处理不同的数据类型。函数模板的格式通常如下所示:
template <typename T, typename U, ...>
return_type function_name(parameter_list)
{
// 函数体
}
其中T和U等是类型参数,它们代表任意的数据类型。在调用函数时,编译器会根据传递的参数类型来实例化相应的函数版本。
(2)类模板:
与函数模板类似,类模板允许创建可以操作不同数据类型的类。类模板的格式大致如下:
template <typename T, typename U, ...>
class ClassName
{
// 类的成员和方法
};
类模板中的T、U等同样代表任意的数据类型,可以根据需要创建不同类型的类实例。
----------------------------------举个具体的列子------------------------------------
#include <iostream>
using namespace std;
//void Swap(char& left,char& right)
//{
// char temp = left;
// left = right;
// right = temp;
//}
//
//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;
//}
//模板,模板参数定义的是类型
template<typename T>
---------------------------------------------------
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
----------------------------------------------------
template<class T1,typename T2>
class Stack
{
public:
Stack(T2 capacity =4)
:_capacity(capacity)
{
cout<<"Stack()"<< endl;
_array = new T1[capacity];
_size = 0;
}
~Stack()
{
delete[] _array;
}
private:
T2 _capacity;
int _size;
T1* _array;
};
int main()
{
//思考一下上面的两个Swap调用的是一个函数吗?
//显然不是的,类型都不一样建立的栈帧也不一样
//那是怎么做的呢?
//是编译器用模板 实例化 生成对应的Swap函数
//模板的本质是本来重复的要程序员自己做的活,现在交给编译器帮我们来做了
//有点像电脑里的npu。
int i = 0, j = 0;
Swap(i,j);
double X = 1.1, Y = 1.5;
Swap(X,Y);
//下面写一个通用的类
Stack<int,int>* st1=new Stack<int,int>(1);
Stack<double,double>* st2=new Stack<double,double>(1.5);
//这段代码可以不写 delete st1 和 delete st2。
// 因为在栈上分配的对象会在离开作用域时自动释放内存。
// 但是,为了良好的编程习惯和避免潜在的内存泄漏,
// 建议在不再需要动态分配的内存时使用 delete 进行释放。
delete st1;
delete st2;
return 0;
}