具体化定义函数模板和类模板的实例化和具体化
最近应用开发的过程中涌现了一个小问题,顺便记录一下原因和方法--具体化定义
一.数函模板
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;
文章结束给大家分享下程序员的一些笑话语录:
程序语言综述
CLIPPER 程序员不去真的猎捕大象,他们只是购买大象部分的库然后花几年的时间试图综合它们。
DBASE 程序员只在夜间猎捕大象,因为那时没人会注意到他们还在使用石弓。
FOXPRO 程序员开始使用更新更好的步枪,这使他们花掉比实际狩猎更多的时间学习新的射击技术。
C 程序员拒绝直接购买步枪,宁可带着钢管和一个移动式机器车间到非洲,意欲从零开始造一枝完美的步枪。
PARADOX 程序员去非洲时带着好莱坞关于猎捕大象的电影剧本,他们认为照剧本行事就会逮到一头大象。
ACCESS 程序员在没有任何猎象经验的经验下就出发了,他们穿着华丽的猎装、带着全部装备,用漂亮的望远镜找到了大象,然后发觉忘了带扳机。
RBASE 程序员比大象还要稀少,事实上,如果一头大象看到了一个RBASE程序员,对他是个幸运日。
VISUAL ACCESS 程序员装上子弹、举起步枪、瞄准大象,这使大象感到可笑,究竟谁逃跑。他们无法抓住大象,因为由于他们对多重控制的偏爱,他们的吉普车有太多的方向盘因而无法驾驶。
ADA、APL和FORTRAN 程序员与圣诞老人和仙女一样是虚构的。
COBOL 程序员对和自己一样濒临灭绝的大象寄予了深切的同情。