C++泛型编程与STL---关于模板

1.模板的概念

模板就是建立通用的模具,从而提高复用性。提到复用性,想必大都会想到一个老朋友---函数,事实也确实如此,C++中的模板两大应用之一就是函数模板。但需要注意的是,C++中的模板只是一个框架,并非某个实例,而仅仅是一个框架,因此在使用时需要给模板以确定的“内容”才能正常使用模板。

注意:

  •  模板不可以直接使用,它只是一个框架
  •  模板的通用并不是万能的

2.函数模板语法

首先来说一下函数模板的作用,在C++中,我们可以通过模板建立一个通用函数,其函数返回值类型和形参的类型可以是不具体指定的,而是可以利用一个虚拟的类型来表示。

语法:

1 template<typename T>

2 函数声明或定义

例如:

template<typename T>
T mysum(T * begin,T * end)
{
    T * p = begin;
    T ans = 0;
    for(T * p = begin; p != end;p++)
    {
        ans = ans + *p;        
    }
    return ans;
}

上例就是一个函数模板的应用,其实实现了一个未知数据类型数组的加和,当然---并不包括数组最后一项。具体逻辑我也不再展开解释,有兴趣的同学可以自行编码运行。

解释:

template --- 声明创建一个模板

typename ---表示其后面的一个符号是一个虚拟数据类型,也可以用class代替

T --- 通用的数据类型,名称可以替换,通常为大写字母

3.函数模板的两种使用方法

  • 自动类型推导
  • 显示指定类型

首先来看自动类型推导,其实顾名思义,就是让编译器自己去猜测我们的传给模板的数据类型是什么,体现在代码中就是---看上例,这个定义好的mysum()函数有两个参数,假设现在又一个整型的数组arr[601]需要求和那我们直接这样调用模板mysum(arr,&arr[600]),就是自动类型推导式的调用,而显示类型推导就是mysum<int>(arr,&arr[600]),它们看起来差别不大,而且你在实际的编码过程中会发现好像加不加<int>都没什么差别,但事实并非如此,因为有时候---当模板函数没有参数时(此时编译器也就推到不出来指定的类型是什么了),则必须给typename所指定的虚拟类型一个确定的数据类型才可以正常使用函数模板。

4.函数模板的注意事项

  • 自动类型推导,必须推导出一致的数据类型T,才可以正常使用。
  • 模板必须要确定出T的类型才可以使用

下面再放一张示例

template<typename T>
void myswap(T &a, T &b)
{
    T temp = a;
    a = b;
    b = temp;
}

void test01()
{
    int a = 109;
    double b = 6.01;
    myswap(a,b);//错误,因为编译器会推导出两个不同的T类型,出现二义性
    
    double c = 12.07;
    double d = 6.01;
    myswap(c,d);//正确
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值