C++复习之函数模板

模板的意义:对类型也可以进行参数化
函数模板:把处理不同类型的公共逻辑抽象成函数,就得到了函数模板。不进行编译,因为类型不知道
模板的实例化:函数调用点进行实例化,会生成一个真正的函数
模板函数:由函数模板实例化出来的函数,需要被编译器所编译
模板的实参推演:可以根据用户传入的实参类型,来推导出模板类型参数的具体类型。
模板的特例化:特殊(不是编译器提供的,而是用户提供的)的实例化
模板函数、模板的特例化、非模板函数的重载关系:编译器优先把compare处理成函数名字,没有的话,采取找compare模板

//函数模板 
template<typename T>//定义一个模板参数列表
bool compare(T a, T b)//compare是一个函数模板
{
    cout << "template compare" << endl;
    return a > b;
}
/*
在函数调用点,编译器用用户指定的类型,从原模板实例化一份函数代码出来

模板函数
bool compare<int>(int a,int b)
{
    return a > b; 
}
bool compare<double>(double a,double b)
{
    return a > b;
}
bool compare<const char*>(const char* a,const char* b)
{
    return a > b;//这里对于字符串类型的大小比较是错误的,需要使用strcmp()函数
}
*/

//模板函数的特例化 针对compare函数模板,提供const char*类型的特例化版本
 template<>
 bool compare<const char*>(const char* a, const char* b)
 {
     cout << "compare<const char*>" << endl;
     return strcmp(a, b) > 0;
 }
 //非模板函数 与模板无关  是普通函数
 bool compare(const char* a, const char* b)
 {
     cout << "compare<const char*>" << endl;
     return strcmp(a, b) > 0;
 }
int main()
{
    //函数的调用点
    compare<int>(20, 30);
    compare<double>(20, 30);
    
    //函数模板实参推演
    compare(20, 30);
    //函数模板实参推演 T const char*
    //对于某些类型来说,依赖编译器默认实例化的模板代码,代码处理逻辑是有错误的,这时候需要对模板提供特例化
    //编译器优先把compare处理成函数名字,没有的话,采取找compare模板
    compare("aaa", "ddd");
    return 0;
}

模板代码不能在一个文件中定义,在另一个文件中使用的。
模板代码调用之前,一定要看到模板定义的地方,这样的话,模板才能够正常的实例化,产生能够被编译器编译的代码。
所以模板代码都是放在头文件之中的,然后在在源文件之中直接进行#include包含。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值