泛型编程与面向对象编程的目标相同,即使重用代码和抽象通用概念的技术更加简单。但是面向对象编程强调编程的数据方面,泛型编程强调的是独立于特定数据类型。
这一篇介绍一下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++泛型编程详解