C++模版和泛型编程

面对对象编程(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、模版实参推断

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值