函数模板和类模板的实例化和具体化
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
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
相关文章推荐
- Android Studio基础之依赖管理(五)-学习篇
- OC中 instancetype、id、NSObject的区别
- Activity界面刷新
- 几种图片下载lib对比
- 编辑器上传的图片不能显示
- SDUT 数据结构实验之查找二:平衡二叉树
- 用微信支付的demo测试,安卓正常支付,ios却报错,报错内容为:timestampget_brand_wcpay_request:fail
- 编程的智慧
- 自定义TabBarItem
- java MD5加密
- android studio运行时报错the selected device is incompatible
- python 10 min系列三之小爬虫(一)
- 石头剪刀布随想
- php导出mysql的数据结构
- 如何在HP-UX中安装bash?
- Action中获取session,request
- dede 相关文章的调用
- 配置文件读取类conf.class.php 单例模式应用
- Dubbo 入门实例 本地伪集群测试Demo
- Sql Server 操作