模板(模板函数+模板类)
- 1.模板
- 1.1 模板出现的原因
- 1.2 函数模板
- 模板函数的定义
- 模板函数的使用方法
- 总结
- 1.2 类模板
- 使用举例
1.模板
1.1 模板出现的原因
- 为了代码重用;
- 使重用的代码不受数据类型的限制
把数据类型设计为一个参数,即参数化(parameterize) 程序设计。
软件模块由模板(template) 构造。包括函数模板(function template)和类模板(class template)。
1.2 函数模板
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,简化重载函数的设计。
模板函数的定义
template<模板参数表>
函数返回类型 函数名(形参列表)
{
函数体;
}
注意
- 模板参数表可以有多个,用逗号分开,但是不能为空
- 模板类型参数(template type parameter)代表一种类型,由关键字 class 或 typename)后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。
模板函数的使用方法
#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>
using namespace std;
template<typename Type>
void Print(vector<Type>& vec)
{
cout<<typeid(Type).name()<<"---->";
for(int i = 0;i < vec.size();i++)
{
cout<<vec[i]<<" ";
}
cout<<endl;
}
int main(void)
{
vector<int> vet{1,2,3,4,5};
vector<char> vec{'a','b','c','d','e'};
vector<float> vef{1.1,2.1,3.1,4.1,5.1};
Print(vet);
Print(vec);
Print(vef);
return 0;
}
总结
函数模板根据一组实际类型构造出独立函数的过程通常是隐式发生的,称为模板实参推演(template
argument deduction)。
为了判断模板实参的实际类型,编译器需检查函数调用中提供的函数实参的类型。ia 的类型为 int 数组,dx的类型为 double 数组。都被用来决定每个实例的模板参数。该过程称为模板实参推演在编译 main0函数中,由编译函数模板(functron template) 而生成的函数,称为模板函数(templatefunction)。这两个概念须分清楚
1.2 类模板
类模板定义如下:
模板定义如下
template<类型模板或参数表>
class 类名{
...... //类声明体
};
template<模板参数表>
返回类型 类名<类型模板或参数表>::成员函数名 1(形参表){
//成员函数定义体
}
template<模板参数表>
返回类型 类名<类型模板或参数表>:成员函数名 n(形参表)......; //成员函数n
{
定义体n
}
模板参数有两种:模板类型参数和模板非类型参数
从通用的类模板定义中生成类的过程称为模板实例化 (template nstantiation)
其格式为:类名<类模板实在参数表>对象名
使用举例
#include <iostream>
#include <algorithm>
#include <vector>
#include <typeinfo>
using namespace std;
template<typename Type>
class SqStack
{
private:
Type* data;
int capacity;
int pos;
public:
SqStack(int sz = 10){
data = new Type[sz];
capacity = sz;
pos = -1;
cout<<typeid(Type).name()<<endl;
}
~SqStack(){
delete []data;
}
};
int main(void)
{
SqStack<int> ist;
SqStack<double> dst;
return 0;
}