函数模板和类模板的实例化和具体化

一.函数模板

1.显示实例化(explicit instantiation)和显示具体化(explicit specialization)的区别:

(1) 形式上:

显示实例化:  template  void  Swap<int> (int ,int);

显示具体化:  template <> void Swap<int> (int,int);

             或     template<>  void Swap   (int,int);

从中我们可以看出区别在于前者以 template 打头,后者以template<> 打头

(2) 含义上:

显示实例化:使用 Swap() 模板生成 int 类型的函数定义,即使用函数模板,用具体的 int 来代替函数模板中的泛型类型,这样就不用额外写函数定义。

显示具体化:不使用Swap()模板生成函数定义,而使用专门的、独立的(即显示具体化所定义的函数)函数定义来显示的为 int 类型生成函数定义,显示具体化要有额外的函数定义部分。

2.隐式实例化(implicit instantiation)比较简单,它是在函数调用时根据参数的具体类型来确定函数模板中的泛型类型。如:

char  ch1,ch2;

……

Swap(ch1,ch2);//  此时用char 类型来替换函数模板中的通用类型

 

3.显示实例化,隐式实例化和显示具体化统称为具体化(specialization),它们的相同之处在于都是用具体的类型的函数定义,而不是通用描述。

二.类模板

1. 显示实例化和显示具体化的区别

(1)形式上:

显示实例化:      template  class  ArrayTp<string,10> ;

显示具体化:      template  <class   T, int  n>

                           class   ArrayTp

                           {

                               ……

                               ……

                            };

                             template  <>  class  ArrayTp<string,10>

                            {

                              ……

                              ……

                            };

从中可以看出,二者的区别类似于函数模板中二者的区别,一个以template 打头,一个以template <> 打头,但都要有class 关键字,因为这是类模板。

(2) 含义上:

显示实例化用通用的类模板ArrayTp生成具体类型(如string)的类定义;

显示具体化不使用类模板定义,而使用自己专用的类定义。

2.部分具体化(partial specialization)

部分具体话,是指部分限制模板的通用性。

如 有以下模板定义: 

template  <class T1, class T2>

class   Pair

{

   ……

};

可以这样实现部分具体化:

 template <class T2>  class Pair<string,T2> 

 {

          ……

 };

template 后面的<> 出现的是未具体化的类型参数。若两个参数都具体化了,则<>内为空,就变成了显示具体化。

3.隐式实例化比较简单,它是在声明对象时根据具体的类型来代替类模板中的通用类型。如: ArrayTp<double,10>  aver;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值