模板声明 template<typename/class T>, typename比class最近后添加到C++标准。ios
常规模板,具体化模板,非模板函数的优先调用顺序。c++
非模板函数(普通函数)> 具体化模板函数 > 常规模板函数
显示具体化:性能
具体化表示为某一特定的类型重写函数模板,声明的含义是使用独立的,专门的函数定义显示地为 特定类型生成函数定义。spa
为何要有显示具体化?处理模板函数所不能处理的特殊状况。显式具体化显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不一样的具体化函数。.net
显示具体化声明在关键字template后包含<>.c++11
如: code
vs2013不支持: ci
在发生函数模板的调用时,不显示给出模板参数而通过参数推演,称之为函数模板的隐式模板实参调用(隐式调用)。如:get
1 2 3 4 5 |
|
显示实例化:
实例:如函数调用swap(i,j)会致使编译器生成swap()的一个实例,该实例使用 int 类型。
句法:声明所需的种类用<>符号指示类型,并在声明前加上关键字template:
为何要有显示实例化?事实上,编译器只在要调用函数的时候才使用到函数,若是不使用显示实例化,每次调用函数时,模板都会消耗性能去推导使用的是哪一个类型的函数,增长了程序运行时的负担;使用了显示实例化,则在编译时就已经处理了函数选择。
实例化示例:
注意:试图在同一个文件(或转换单元)中使用同一种类型的显示实例化和显示具体化声明,会出错。
推荐:能够用在函数调用时,直接显示实例化,而不使用显示实例化声明。
如:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
模范代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
|
总结:
隐式实例化指的是:在使用模板以前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。如:int i=0, j=1;swap(i, j); //编译器根据参数i,j的类型隐式地生成swap<int>(int &a, int &b)的函数定义。Array<int> arVal;//编译器根据类型参数隐式地生成Array<int>类声明和类函数定义。
显式实例化:当显式实例化模板时,在使用模板以前,编译器根据显式实例化指定的类型生成模板实例。如前面显示实例化(explicit instantiation)模板函数和模板类。其格式为:template typename function<typename>(argulist);template class classname<typename>;显式实例化只需声明,不须要从新定义。编译器根据模板实现实例声明和实例定义。
显示具体化:对于某些特殊类型,可能不适合模板实现,须要从新定义实现,此时可使用显示具体化(explicite specialization)。显示实例化需从新定义。格式为:template<> typename function<typename>(argu_list){...};template<> class classname<typename>{...};