template<typename T1,typename T2>//这里的typename也可以替换成class
T1 Func(const T1& a,const T2& b){//也可以有返回值
cont<<a<<""<<b<<endl;
}
//实例化推演出具体的函数
int main(){
Func(x,y);
}
template<typename T>
Add(const T& a,const T& b){/const 放置权限被放大
return a+b;
}
int main(){
//实参传递的类型,推演T 的类型
double x=1.2,y=2.3;
int s=1,z=9;
count<<Add((int)x,z)<<endl;
count<<Add(x,(double)z)<<endl;
//显式实例化
count<<<int>Add(a,z)<<endl;
count<<<double>Add(a,z)<<endl;
}
template<ttypename T>
T* Alloc(int n)
{
return new T[n];
}
int main(){
// 有些函数无法自动推,只能显示实例化
double* p1 = Alloc<double>(10);
return 0;
}
类模板
// 类模板
template<class T>
class Stack
{
public:
Stack(size_t capacity = 3);
void Push(const T& data);
// 其他方法...
~Stack()
{
if (_array)
{
free(_array);
_array = NULL;
_capacity = 0;
_size = 0;
}
}
private:
T* _array;
int _capacity;
int _size;
};
int main()
{
Stack<int> s1; // int
Stack<double> s2; // double
Stack<char> s3; // char
return 0;
}
template<class T>
Stack<T>::Stack(size_t capacity)
{
/*_array = (T*)malloc(sizeof(T) * capacity);
if (NULL == _array)
{
perror("malloc申请空间失败!!!");
return;
}*/
_array = new T[capacity];
_capacity = capacity;
_size = 0;
}
template<class T>
void Stack<T>::Push(const T& data)
{
// CheckCapacity();
_array[_size] = data;
_size++;
}
template<class T>
void Stack<T>::Push(const T& data)
{
// CheckCapacity();
_array[_size] = data;
_size++;
}
int main()
{
Stack<int> s1; // int
Stack<double> s2; // double
Stack<char> s3; // char
return 0;
}
// 普通类,类名和类型是一样
// 类模板,类名和类型不一样
// 类名:Stack
// 类型:Stack<T>