类模板 构造函数_Chapter16:模板(二)——显式具体化和显式实例化

784090e3f0ef6a6a502de622eff51a05.png

一、改变模板的“游戏规则”

C++ 没有办法限制类型参数的范围,我们可以使用任意一种类型来实例化模板。但是模板中的语句(函数体或者类体)不一定就能适应所有的类型,可能会有个别的类型没有意义,或者会导致语法错误。

比如说在模板函数内比较值的大小,这对一些基本数据类型有用,但是却不能用来比较结构体、类和数组等数据——我们并没有针对它们进行重载。对于指针来说,比较的是地址大小,而不是指针指向的数据,所以也没有现实意义。总之,我们必须对它们进行单独处理。

模板是一种泛型技术,它能接受的类型是宽泛的、没有限制的,并且对这些类型使用的算法都是一样的(函数体或类体一样)。但是现在我们希望改变这种“游戏规则”,让模板能够针对某种具体的类型使用不同的算法(函数体或类体不同),这在 C++ 中是可以做到的,这种技术称为模板的显式具体化(Explicit Specialization)。

模板函数如何显式实例化?看一下这个例子:

#include <iostream>
#include <string>
using namespace std;
typedef struct{
    
    string name;
    float score;
} STU;

template<typename T> const T & Max(const T &a, const T &b){
    
    return a > b ? a : b;
}

template<> const STU & Max<STU>(const STU &a, const STU &b){
    
    return a.score > b.score ? a : b;
}

ostream & operator << (ostream & out, const STU &stu){
    
    out << stu.name << ' ' << stu.score;
    return out;
}

int main(int argc, char const *argv[]){
    
    int a = 10, b = 20;
    cout<<Max(a, b)<<endl;

    STU stu1 = {
    "Sam", 90}, stu2 = {
    "Amy", 100};
    cout<<Max(stu1, stu2);
    return 0;
}

请格外注意这一行:

template<> const STU & Max<STU>(const STU &a, const STU &b)

Max<STU>中的STU表明了要将类型参数 T 具体化为 STU 类型,原来使用 T 的位置都应该使用 STU 替换,包括返回值类型、形参类型、局部变量的类型。Max 只有一个类型参数 T,并且已经被具体化为 STU 了&#

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值