模板函数,模板函数重载,显示具体化模板,实例化

编译器在选择原型时,非模板版本函数优先于显示具体化和模板版本函数,而显示具体化优先于使用常规模板函数版本

1 函数模板

声明与定义时均需加上template <class T>说明为函数模板。

eg .   template <typename T >

declaration:eg.template <typename T > void swap(T & a1 ,T & a2) ;  函数模板声明。

definition : template <class T >void  swap( T &a1 ,T & a2) 

{ T temp ; 

temp = a1 ;

a1 = a2 ;

a2 = temp ;

}

definition : template <class T > void swap( T &a1 ,T & a2) { T temp ; temp = a1 ; a1 = a2 ; a2 = temp ; }


2 模板函数重载版本。


3显示具体化模板函数 以 template <> 打头

template <> void swap<job> (job & ,job &)
其中<job>是可选的,即可写成
template <> void swap(job & ,job &) 
job可为某种类


在代码中包含函数模板本身不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时(即使用具体类型的参数来调用模板函数时),得到的是模板实例,模板并非函数定义,但使用具体类型的模板实例是函数定义。这种实例化方式为隐式实例化。

C++也允许显式实例化。即提前指明类型。并在前面加上template。

template void swap<int>(int ,int ) ;  显式实例化。

template <> void swap<int >(int , int ) 显式具体化。

在同一个文件中使用同一种类型的显示实例化和显示具体化将出错。


C++11新特性

template   <class T1,class T2>

void ft(T1 x ,T2 y)

{

.....

?type?  xpy = x+ y ;

.....

}

1.因为不知道x+y的类型,所以C++11 引入了decltype 

decltype(x) y , 让y和x的类型一致。

即上面的模板函数可以, decltype(x+y) xpy ; xpy = x+y ;  或者 decltype (x+y)  xpy=x+y ;

2.template<class T1 ,class T2>

?type? gt(T1 x , T2 y)

{

.....

return x+y ;

.....

}

返回类型是decltype(x+y),但是此时还未声明参数x,y,它们不在作用域内,所以C++引入了后置返回类型。

上面函数可以改为

auto gt(T1 x ,T2 y) -> decltype(x+y)

{

return x+y ;

}

举例:

auto h(float x ,float y) -> double ; 也可直接指明类型

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值