c++泛型编程详解

  

泛型编程与面向对象编程的目标相同,即使重用代码和抽象通用概念的技术更加简单。但是面向对象编程强调编程的数据方面,泛型编程强调的是独立于特定数据类型。

  

这一篇介绍一下c++编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板,类模板和成员模板三大部分

  

如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢

  

  

模板是泛型编程的一种重要思想,STL(标准模板库,标准模板库)是采用模板实现的一个实例
  函数模板

  

对比函数重载(同一作用域内函数名相同,参数列表不同的函数),函数模板只需要一个函数就实现了函数重载的部分功能(参数个数相同类型不同,函数重载需要定义多个同名参数列表不同的函数)
  

        template//这也可以写template此处的阶级和typename作用相同   空白tfunc (T&t, Y&y) {   cout & lt; & lt;t & lt; & lt;”“& lt; & lt;y & lt; & lt;endl;   }   int n=2;   双d=2.1;   tfunc (n、d);//运行结果:2 - 2.1      

函数模板具体化,函数模板具体化就是将某一(某几)个要处理的类型单独处理,需要单独写一个实现,形式是template<比;无效的乐趣(type&t);函数模板的具体化和普通函数可以同时存在,调用顺序是普通函数比;函数模板具体化比;模板函数

  

     //======测试一:函数模板针对特殊数据类型具体化======结构节点{   int val;   节点*下;   };//函数模板   template   空白tfunc (const T&t) {   cout & lt; & lt;模板:“& lt; & lt;t & lt; & lt;endl;   }//函数模板具体化(用于处理节点类型数据)   template<比;   空白tfunc (const Node&节点){   cout & lt; & lt;“template:“& lt; & lt;节点。val & lt; & lt;endl;   }//函数模板具体化(用于处理int类型数据)   template<比;   空白tfunc (const int&n) {   cout & lt; & lt;“template:“& lt; & lt;n & lt; & lt;endl;   }//普通函数   空白tfunc (const int&n) {   cout & lt; & lt;“tfunc ():“& lt; & lt;n & lt; & lt;endl;   }   双d=2.1;   tfunc (d);//函数模板未具体化两类型函数,调用模板   节点节点{2,nullptr};   tfunc(节点);//函数模板具体化节点类型函数,调用函数模板的具体化   int n=2;   tfunc (n);//函数模板具体化int类型函数,也存在普通函数,调用普通函数//======测试二:函数模板部分具体化======template   空白tfunc (T1 T1, T2 T2) {   cout & lt; & lt;类型id (T1) . name () & lt; & lt;”和“& lt; & lt;类型id (T2) . name () & lt; & lt;”:“& lt; & lt;t1 & lt; & lt;”“& lt; & lt;t2 & lt; & lt;endl;   }   template   空白tfunc (T1 T1, int i) {   cout & lt; & lt;类型id (T1) . name () & lt; & lt;”和“& lt; & lt;“int:“& lt; & lt;t1 & lt; & lt;”“& lt; & lt;我& lt; & lt;endl;   }   template   空白tfunc(长l, T2 T2) {   cout & lt; & lt;“长”& lt; & lt;类型id (T2) . name () & lt; & lt;”:“& lt; & lt;l & lt; & lt;”“& lt; & lt;t2 & lt; & lt;endl;   }   template<比;   空白tfunc (l, int i) {   cout & lt; & lt;“长,int:“& lt; & lt;l & lt; & lt;”“& lt; & lt;我& lt; & lt;endl;   }//分别调用以上四个模板函数   tfunc (char (“c”), char (' c '));   tfunc (char (“c”), int (10));   tfunc(长(10),字符(' c '));   tfunc(短(10),int (10)),      

函数模板实例化,让编译器生成指定类型的函数定义,不用写函数的实现,形式是模板无效乐趣(type&

t);   

     //函数模板   template   空白tfunc (const T&t) {   cout & lt; & lt;模板:“& lt; & lt;t & lt; & lt;endl;   }//函数模板实例化,不用写函数的实现,编译器会生成该类型的模板具体化函数   模板无效tfunc (const char&c);   之前      

  

  

类模板可以指定默认模板参数(函数模板不可以),跟函数参数的默认值一样,必须从右向左连续赋值默认类型,如果实例化对象时又传递了类型,默认类型会被覆盖掉,跟函数参数是一样的
  创建对象时需要传递模板参数列表,模板参数列表加在类名后面ClassName   

表有默认值,可以不传模板参数,但一定要加& lt;比;如ClassName<比;classN;创建堆区对象的时候,所有的类名称后面都要加模板参数列表,如ClassName

c++泛型编程详解