C++模版和泛型编程

时间:2022-01-05 01:40:45

面对对象编程(OOB):能处理类型在程序运行之前都未知的情况
泛型编程:在编译时能获知类型
它们在编写时都不知道类型
泛型编程:容器,迭代器

1、定义模版

//书写函数比较两个变量的大小,在不知道变量类型的时候,需要定义多个重载函数,它们的函数体完全一致,唯一的差距是参数的类型
int compare(const string &v1,const string &v2){
if(v1<v2) return -1;
if(v1>v2) return 1;
return 0;
}
int compare(const double &v1,const double &v2){
if(v1<v2) return -1;
if(v1>v2) return 1;
return 0;
}
//我们可以定义一个通用的函数模版,而不是为每一个类型都定义一个新的函数,一个函数模版就是一个公式
上面的两个函数的模版可以写为:
template<typename T>
int compare(const T& v1,const T &v2){
if(v1<v2) return -1;
if(v1>v2) return 1;
return 0;
}

上面可以看到,模版的定义以关键字templata开始,后面跟上模版的参数列表,用逗号隔开,用尖括号包围。
使用模板时,指定模版的实参。

vector<int> vec1{1,2,3},vec2{4,5,6};
cout<<compare(vec1,vec2)<<endl;//T是vector<int>

模版类型参数
我们的compare函数有一个模版类型参数,类型参数看为类型说明符

template <typename T> 
T foo(T* p){
T temp=*p;
return temp;//temp类型是p指针指向的类型
}

类模版

template <typename T> class Blob{
public:
typedef T value_type;
//构造函数
Blob();
typedef typename vector<T>::size_type size_type;
}
//我们的blob类有一个叫做T的模版类型参数
//实例化
Blob<string> names;
Blob<double> prices;
//上面两个实例实例化两个不同的类

类模版的成员函数

template <typename T>
void Blob<T>::check(size_t i,const string &msg){
......
}

模版参数和作用域
一个模版参数名的作用范围在其声明之后到模版声明结束前
在模版内不能重用模版参数名

2、模版实参推断