您的位置:首页 > 其它

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

2015-12-11 15:51 417 查看
一.函数模板

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;

FROM: http://www.2cto.com/kf/201305/208942.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: