模板的局限性及解决方法——显式具体化

模板函数中假定了一些操作,但是当使用模板函数时可能这些操作不能与使用的具体类型匹配(比如T为结构时不能与操作<匹配,T为数组时不能和普通cin语句匹配)

解决方法:

法1.对需要用到的运算符进行重载

法2.为不符合函数模板使用的特定类型提供具体化的模板定义——显式具体化

显式具体化:提供一个具体化的函数定义,其中包含不符合函数模板类的特定类型所需要使用的代码,当编译器找到与函数调用相符合的具体化定义时,将使用该定义避免使用不合适的函数模板

对于一个给定的函数名,可以有非模板函数,非模板函数的重载,函数模板,函数模板重载,显式具体化模板函数,显式具体化模板函数的重载共六类版本

优先级为:非模板函数>显式具体化>常规模板,当函数调用与高优先级匹配后不再尝试去匹配低优先级

显式具体化的原型和定义以template<>开头,并通过名称指出类型

 eg:

template<> void Swap(int &, int &);//显式具体化的一个声明

代码中包含函数模板比那个不会生成函数,她只是一个生成函数定义的方案

编译器使用函数模板为特定类型生成函数定义时得到的是一个模板实例/模板函数

函数模板不是一个函数,但是模板实例是一个函数

这种调用函数模板时给予特定类型参数得到模板实例的方法称为隐式实例化

显式实例化:

通过特定的语句要求编译器直接创建特定类型的模板实例,eg:

1 template  void Swap<int>(int & , int &);
2 //显式实例化,在声明的函数名后用<>括起代替参数化类型的具体类型
3 template <> void Swap(int & , int &);
4 template <> void Swap<int> (int & , int &);
5 //显式具体化,两种表示方式完全等价
//显式实例化要求编译器直接创建特定类型的模板实例
//显式具体化创建一个特殊的函数模板,当调用该显式具体化会生成一个此类型的模板实例
//易见二者最终都会生成一个模板实例,因此相同特征标的显式具体化和显式实例化不能出现在同一个文件中

注意区分显式实例化和显式具体化的使用细节差异和功能差异

隐式实例化、显式实例化、显式具体化统称为具体化,相同之处为他们表述的都是使用具体类型的函数定义而不是通用描述

 

posted @ 2022-05-29 02:55  卷卷卷卷出一片天  阅读(74)  评论(0)    收藏  举报