模板函数和类模板基础(部分)
模板技术:可以使类型参数化,编写代码时可以忽略类型。避免重复编写。
优点就是好维护。毕竟写得多错的多。
模板函数:和普通函数差不多,为了让编译器能够区分,就要写上template
template<class/typname T>//它之后写的函数就可以用T替代函数类型,但是值得注意的是,它只对下面第一个函数起作用
举个例子:
template<class/typname T>
void myswap(T &a , T &b){
T tmp = a;
a = b;
B = tmp;}
Void test(){
int a = 1;
int b = 2;
myswap(a,b);//自动转换类型 也可以显式转化myswap<int>(a,b)
cout<<a<<" "<<b<<endl;}
两者区别:普通函数可以进行函数类型的自动转换,模板函数必须是严格的类型匹配
example:
当创建两个myswap;
template<class T>
void myswap(T &a,T &b)
void myswap(int a,char b)
//当调用函数类型不相同时,用的是2,相同时用的是1.原因见两者区别
那模板函数和普通函数一起调用的规则是什么呢:
• 它可以像普通函数一样被重载;
• 但是优先考虑普通函数;
• 若函数模板可以产生更好的匹配,就选模板;
• 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
类模板: 定义和使用与函数模板类似,但其在表示像组,表,图等数据结构就显得很重要
这些数据结构的表示不受所包含的数据类型的影响。
调用时不能自动进行类型推导,必须显示指定类型。
• 单个类模板举例:
template<class T>
class Person{
public:
Person(T id , T age){
Mid = id;
Mage = age;
}
T Mid;
T Mage;
};
//调用时;
int main(){
person<int>p(10,20);}//必须加入函数类型;
• 类模板派生类模板:
template<class T>
class Person{
public:
Person(T id , T age){
this-> Mid = id;
this-> Mage = age;
}
T Mid;
T Mage;
};
//一定要加int,因为需要给它分配内存
//class subperson : public person<int>{};(这是派生非类模板)
//所以派生类模板是:
Template<class T>
class subperson : public person<T>{};
• 类模板类基本实现和运用:
#include <bits/stdc++.h>
using namespace std;
template<class T1,class T2>
struct Person{
public:
Person(T1 name , T2 age){
this->Mname = name;
this->Mage = age;
}
public:
T1 Mname;
T2 Mage;
void show(){
cout<<Mname<<" "<<Mage<<endl;
}
};
void test(){
Person<string,int>p("zhangsan",20);
p.show();
}
int main(){
test();
return 0;
}
Int main(){
person<int>p(10,20);}