【关于template】
【关于template】模版
函数模版
代表了一个函数家族,与类型无关
在使用时被参数化,根据实参类型产生函数的特性类型版本

举例 生成了两个不同的函数

定义函数模版
template<class T>//template<typename T>
//变量类型直接用T代替
T 函数名(T x, T y,...)
{
...
}
模版参数实例化
隐式实例化
让编译器根据实参类型,自己推演

->会报错
->解决方案:强制类型转换
显式实例化

->不会报错
类模版
实例化后的类是真正的类
代码模版
template<class T1, class T2, ..., class Tn>//变量类型代称
class A
{
// 类内成员定义
};
示例代码
#include<bits/stdc++.h>
using namespace std;
template<class T1,class T2>
class Pair{
public:
Pair(T1 fi,T2 se){
first_=fi;
second_=se;
}
T1 getFirst(){
return first_;
}
T2 getSecond(){
return second_;
}
private:
T1 first_;
T2 second_;
};
int main(){
Pair<int,int> pair_one=Pair(10,20);
cout<<"PairOne:"<<pair_one.getFirst()<<" "<<pair_one.getSecond()<<endl;
Pair<int,string> pair_two=Pair(555,(string)"vw50");
cout<<"PairTwo:"<<pair_two.getFirst()<<" "<<pair_two.getSecond()<<endl;
return 0;
}
模版参数
类型形参
typename T
非类型形参
size_t N=10
示例代码
(有点问题)
//手写array
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
namespace qwq{
template<typename T,size_t N=10> //size_t N :如果没有定义数组长度默认10
class Array{
public:
//引用:可修改和查询
T& operator[](size_t index){
return array_[index];
}
//常量:只允许查询
const T& operator[](size_t index) const {//记得后面还要加const
return array_[index];
}
//查询长度
size_t size(){
return _size;
}
//查询是否为空
bool empty(){
return _size==0;
}
private:
T array_[N];
size_t _size;
};
}
int main(){
qwq::Array<int,555> a1;
qwq::Array<int> a2;
cout<<a1.size()<<endl;
cout<<a2[3]<<endl;
return 0;
}
模版分离编译
如果有用到template:不能分成hpp和cpp
//.hpp内
//声明
template<class T>
T Add(const T& left, const T& right);
void Func();
//定义
template<class T>
T Add(const T& left, const T& right){return left + right;}
void Func(){std::cout << "Func()" << std::endl;}

浙公网安备 33010602011771号