C++标准模板库(STL)前置知识——day1(函数模板)

一、概述

  在C++中,模板的意义就是将类型参数化,函数模板负责抽象出某一种操作,而操作的数据类型以及返回值的类型由程序员调用的时候决定。

二、函数模板与模板函数

  初学的时候容易把这两者弄混,其实这两者是不一样的。函数模板是模板,由于类型还不确定,编译器不会去编译模板,而模板函数是函数模板实例化出来的一个函数,此时类型已经确定,编译器会编译模板函数。
  比如说下面是一个函数模板,compare是模板名,编译器不会编译这一段代码。

template<typename T>
bool compare(T a, T b){
    return a>b;
}

  但当用户调用模板代码的时候,比如

compare<int>(3,4);

  将会实例化出一个模板函数,如下,其中函数名字为compare<int>,这段代码才是被编译器编译的函数定义。

bool compare<int>(int a,int b){
    return a>b;
}

三、实参推演

  假如我们定义了一个函数模板,如下

template<typename T>
bool compare(T a, T b){
    return a>b;
}

  一般的使用方式是指定类型去使用,比如

compare<int>(3,4);
compare<double>(1.2,2.2);

  但如果我们不指定类型的话,比如

compare(3,4);
compare(1.2,2.2);

  这样也是可以的,而且结果也是我们想要的,因为此时编译器会进行实参推演,根据传入参数的类型自动实例化出合适的模板函数。

compare(3,4); //compare<int>(3,4);
compare(1.2,2.2);//compare<double>(1.2,2,2);

  注意,如果没法配匹到合适的模板函数,编译器依然会报错。比如像如下调用时,没法匹配到两个参数为不同类型(int,double)的模板函数,所有会报错。

compare(3,2.2);

四、模板的特例化

  还是使用上面的compare函数模板,当我们调用如下代码时

compare<const char*>("123","456");

  编译器虽然不会报错,但得到的结果是比较两个字符串的地址的大小,于我们而言没有什么意义,我们想得到的是字符串内容的大小关系,此时就需要使用特例化,重写当类型为const char * 时的比较逻辑,示例如下:

template<>
bool compare(const char* a,const char* b){
    return strcmp(a,b)>0;
}

五、注意事项

  模板代码一般放在头文件中定义好,然后在源文件中#include包含,如果头文件中只有声明,没有定义,编译的时候会出现链接错误,因为没办法实例化该模板函数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值