• C++的模板template


    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。   模板是一种对类型进行参数化的工具;  因此,使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。  通常有两种形式:函数模板和类模板;   函数模板针对仅参数类型不同的函数;

    1、函数模板(function templates) 格式:

    template<class 形参名1,class 形参名2,...> 返回类型 函数名(参数列表)    {       函数体    }

    其中,template 和class是关键字,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。

    函数模板的实例化: 模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。

    比如swap的模板函数形式为     

      template < class T> void swap(T& a, T& b){},

    当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中a和b是int 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中c和d是double类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。

    2、类模板(class templates) 格式:

    template< class 形参名1,class 形参名2,...>class  类名     { ... };  

     类模板和函数模板都是以template开始后接模板形参列表组成,

    模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明

    。比如     

    template <class T> class A{public: T a; T b; T hy(T c, T &d);}; 在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。

    举例来说,线性表就可以做出关于顺序表、链表、栈、队列的一个模板:

    template < class T> class List{

    void Clear(); // 置空线性表 BOOL IsEmpty(); //线性表为空时,返回TRUE;

    BOOL append(const T value); //在表尾添加一个元素value,表的长度加1;

    BOOL Insert(const int p, const T Value); //在位置p上插入元素value,表的长度加1;

    BOOL delete(const int p); //delete位置p上的元素,表的长度-1;

    BOOL GetPos(int &p, const T value); //查找value的位置,并返回位置

    BOOL GetValue(const int p, T &value); // 把位置p的 value 返回

    BOOL SetValue( const int p, const T value); // 把位置p的元素设为value

    }

    类模板对象的创建:比如一个模板类A,则使用类模板创建对象的方法为A m;在类A后面跟上一个<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int 所代替。当类模板有两个模板形参时创建对象的方法为A<int, double> m;类型之间用逗号隔开。   

    对于类模板,模板形参的类型必须在类名后的尖括号中明确指定。比如A m;用这种方法把模板形参设置为int是错误的(编译错误:error C2079: 'a' uses undefined class 'A'),类模板形参不存在实参推演的问题。也就是说不能把整型值2推演为int 型传递给模板形参。要把类模板形参调置为int 型必须这样指定A m。

       在类模板外部定义成员函数的方法为:    

     template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体},

    比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:    

     template void A<T1,T2>::h(){}。 注意:当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。   

    再次提醒注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

  • 相关阅读:
    教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
    那些年,我们在Django web开发中踩过的坑(一)——神奇的‘/’与ajax+iframe上传
    刷题记录:[De1CTF 2019]Giftbox && Comment
    刷题记录:[强网杯 2019]Upload
    刷题记录:[XNUCA2019Qualifier]EasyPHP
    [RoarCTF 2019]simple_uplod
    [RoarCTF 2019]Online Proxy
    [RoarCTF]Easy Java
    [RoarCTF]Easy Calc
    刷题记录:[DDCTF 2019]homebrew event loop
  • 原文地址:https://www.cnblogs.com/wanganyi/p/8278286.html
Copyright © 2020-2023  润新知