CPP学习备忘[12] 模板

来源:互联网 发布:虚拟货币交易软件 编辑:程序博客网 时间:2024/06/05 21:00
 

【1】模板使程序员能够快速建立具有类型安全的类库集合和函数集合,以方便更大规模的软件开发。C++的STL全赖于模板实现,模板是C++面向对象程序设计的重要补充。

 

【2】函数模板的定义形式为:

    template<类型参数表>

    返回类型 函数模板名(数据参数表)

    {

        函数模板定义体;

    }

 

【3】函数模板不是函数,它是以具体的类型为实参来生成函数体的模板。函数模板定义被编译时,不会产生任何执行代码。函数模板定义只是对未来生成的函数体的描述,表示它每次能单独处理在模板形参表中说明的数据类型。第一次使用函数模板时,会触发编译器产生一个对应函数模板的函数定义。

 

【4】一个函数模板可以生成许多不同的模板函数,这些不同模板函数并不是重载函数,因为其函数名称各不相同,如swap<double>不同于swap<int>。

 

【5】模板函数调用是寻求函数模板的类型参数匹配,类型实参与类型形参的匹配规则与函数的数据实参类型与数据形参类型匹配规则不同。类型实参与类型形参匹配规则更苛刻。模板类型参数没有隐式转换之说。

 

【6】const T& a与T const& a等价;

    对于常量引用型参数,可以通过显式模板类型指定来规定调用的代码。对于调用中的几个数据实参类型不同,而数据形参类型却要求相同时,用显式模板类型指定的方法是必要的,否则模板参数将拒绝匹配。

显式模板类型指定可以显示指定模板的类型实参,从而也就规定了数据形参的类型,免去了数据实参的演绎,同时也给出模板函数名。实际上就是使模板函数成为了普通函数,因而服从普通函数的匹配规则。

当然还可以预先将数据实参转换成预料的数据实参演绎所需要的类型。如:

    template<typename T>

    T const& max(T const& a,T const&b){

        return a<b?b:a;

    }

    int main(){

        int ia=3;

        double db=5.0;

        std::cout<<max<double>(ia,db)<<”\n”;

        std::cout<<max(static_cast<double>(ia),db)<<”\n”;

 

【7】被激活的实例化只实例化类模板的定义部分,不将成员函数的定义部分一起实例化,直到后面首次遇到模板类成员函数调用时,才迫不得已进行类模板的成员函数实例化。所以,类模板成员函数的实例化是被单独激活的。

可以通过显式实例化的方式获得模板类和模板函数。显式实例化是通过引入一个template来获得的,显式实例化没有拖沓的毛病,它会马上将所有的类模板的成员函数都实例化成对应的模板成员函数。例如:

    template List<double>;

    List<double> dList;

 

【8】模板机制规定,如果一个调用既匹配普通函数,又匹配模板函数,则先匹配普通函数。

【9】模板类以模板名打头后跟尖括号括起来的类型实参。

    类模板是一种模板,它通过在类定义上铺设类型参数的形式,表示具有相似操作的系列类。类模板名简称模板名,它是模板定义中的主体名称而跟在class后面,如template<typename T>class List中的List;

 

【10】模板参数可以被默认。如向量容器实际有两个模板参数,只不过第二个参数是默认参数,向量的声明形式为:

template<class T,class Allocator =allocator<T>>

class vector;

向量类模板的第二个参数是内存分配器,是STL提供的。

 

【11】如果不想用预定义的类模板来生成模板类,而是以该模板类名自己专门重写一个模板类,则得到模板铸件。得到模板铸件的过程,称为模板定做。

     模板定做时,必须以template<>开始,然后在class后跟类模板名,即定义需要定做的类。定做时,成员可以在原先类模板的基础上随心所欲的增删,因此,定做的实现可以与类模板的实现完全不同。定做的成员函数不再是模板函数,而是普通函数。类模板中的成员中的类型参数T将被定做的类型取代。

         如:

         //以下为模板定做

         template<>

         class List<Cat>{

            ….

         }

         void List<Cat>::add(Cat& n){//与类模板的成员函数实现上有差异

            …

         }

 

【12】模板定做不一定要全部定做,如果一个类模板的类型参数多于一个,而定做其中一部分类型参为确定的类型,则称为局部定做。模板一旦局部定做,则产生的模板铸件就仍然是类模板。

 

【13】以分离方式组织模板代码,即将类模板定义与类模板实现分离,分别写入头文件和定义文件,在使用模板的源文件中包含模板声明的头文件,也就是与函数或类的使用方式一致。但是在模板声明和模板定义的template关键字前要加export关键字。

 

【14】利用模板可以实现静多态:函数模板的模板参数不同,其函数体中同一操作所反映的行为也不同。区别于基于虚函数机制的同一类继承体系的动多态。

    

 

原创粉丝点击