C++模板如何使用(C++,开发技术)

时间:2024-05-08 06:38:57 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    一、函数模板

    1.1函数模板概念

    函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

    1.2 函数模板格式

    template<typename T1, typename T2,&hellip;,typename Tn>

    返回值类型 函数名(参数列表){}

    template<classT>voidswap(T&a,T&b){ Ttmp=a; a=b; b=tmp;}

    注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)

    1.3 函数模板的原理

    函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模板就是将本来应该我们做的重复的事情交给了编译器

    C++模板如何使用

    在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

    1.4 函数模板的实例化

    用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化

    隐式实例化:让编译器根据实参推演模板参数的实际类型

    template<classT>TAdd(constT&left,constT&right){returnleft+right;}intmain(){inta1=10,a2=20;doubled1=10.0,d2=20.0;Add(a1,a2);Add(d1,d2);/*该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器无法确定此处到底该将T确定为int或者double类型而报错注意:在模板中,编译器一般不会进行类型转换操作,因为一旦转化出问题,编译器就需要背黑锅Add(a1,d1);*///此时有两种处理方式:1.用户自己来强制转化2.使用显式实例化Add(a,(int)d);return0;}

    显式实例化:在函数名后的<>中指定模板参数的实际类型

    intmain(void){inta=10;doubleb=20.0;//显式实例化Add<int>(a,b);return0;}

    如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。

    二、类模板

    2.1 类模板的定义格式

    template<classT1,classT2,...,classTn>class类模板名{//类内成员定义};//动态顺序表//注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具template<classT>classVector{public:Vector(size_tcapacity=10):_pData(newT[capacity]),_size(0),_capacity(capacity){}//使用析构函数演示:在类中声明,在类外定义。~Vector();voidPushBack(constT&data);voidPopBack();//...size_tSize(){return_size;}T&operator[](size_tpos){assert(pos<_size);return_pData[pos];}private:T*_pData;size_t_size;size_t_capacity;};//注意:类模板中函数放在类外进行定义时,需要加模板参数列表template<classT>Vector<T>::~Vector(){if(_pData)delete[]_pData;_size=_capacity=0;}

    2.2类模板的实例化

    类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

    //Vector类名,Vector<int>才是类型Vector<int>s1;Vector<double>s2;
     </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
    本文:C++模板如何使用的详细内容,希望对您有所帮助,信息来源于网络。
    上一篇:如何使用json对象转化为key,value的对象数组下一篇:

    12 人围观 / 0 条评论 ↓快速评论↓

    (必须)

    (必须,保密)

    阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18