关于模板函数具体化实例化的问题

模板函数式为了减少书写代码的工作量,可以讲不同类型的参数适用同一个函数模板,但是,如果参数是一个结构体中的某个元素,如果继续使用模板函数的话,就会对整个结构体参数进项操作,达不到目的,这时候,就引入了显式具体化。

显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不同的具体化函数。

template<>void swap<job>(job &a, job &b)
{
int salary;
salary = a.salary;
a.salary = b.salary;
b.salary = salary;
}

显式实例化只需声明,不需要重新定义。编译器根据模板实现实例声明和实例定义。

在代码中包含模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。其实模板实例就是调用模板时编译器为这个类型的参数定义了一个函数。
当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。

隐式实例化指的是:在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。、

template<class T>

void Swap(T&,T&);


template<>void Swap<job>(job &,job&);

int main()

{

template void Swap<char>(char &,char&);

short a,b;

Swap(a,b);

job n,m;

Swap(n,m);

char g,h;

Swap(g,h);

}

编译器看到char 的显示实例化后,将使用模板定义来生成Swap()的char版本。对于其他SWAP()调用,编译器根据函数调用中世纪使用的参数,生成相应的版本,例如,当编译器看到函数调用Swap(a,b)后,将生成Swap的short版本,因为两个参数的类型都是short ,当编译器看到Swap(n,m)后,将使用job类型提供的独立定义(显示具体化)。当编译器看到swap(g,h),将使用处理显示实例化时生成的模板具体化。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值