C++ 泛型编程详解
泛型编程与面向对象编程的目标相同,即使重用代码和抽象通用概念的技术更加简单。但是面向对象编程强调编程的数据方面,泛型编程强调的是独立于特定数据类型。
这一篇介绍一下C++编程中与面向对象并列的另一大分支——泛型编程,这一篇主要介绍函数模板、类模板和成员模板三大部分
如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢
泛型编程
模板是泛型编程的一种重要思想,STL(StandardTemplateLibrary,标准模板库)是采用模板实现的一个实例
函数模板
对比函数重载(同一作用域内函数名相同,参数列表不同的函数),函数模板只需要一个函数就实现了函数重载的部分功能(参数个数相同类型不同,函数重载需要定义多个同名参数列表不同的函数)
template//这也可以写template 此处的class和typename作用相同 voidtfunc(T&t,Y&y){ cout< 函数模板具体化,函数模板具体化就是将某一(某几)个要处理的类型单独处理,需要单独写一个实现,形式是template<>voidfun(type&t);,函数模板的具体化和普通函数可以同时存在,调用顺序是普通函数>函数模板具体化>模板函数
//======测试一:函数模板针对特殊数据类型具体化====== structNode{ intval; Node*next; }; //函数模板 templatevoidtfunc(constT&t){ cout<<"template:"< voidtfunc (constNode&node){ cout<<"template :"< voidtfunc (constint&n){ cout<<"template :"< voidtfunc(T1t1,T2t2){ cout< voidtfunc(T1t1,inti){ cout< voidtfunc(longl,T2t2){ cout<<"longand"< voidtfunc(shortl,inti){ cout<<"longandint:"< 函数模板实例化,让编译器生成指定类型的函数定义,不用写函数的实现,形式是templatevoidfun(type&t);
//函数模板 templatevoidtfunc(constT&t){ cout<<"template:"< (constchar&c); 类模板
类模板可以指定默认模板参数(函数模板不可以),跟函数参数的默认值一样,必须从右向左连续赋值默认类型,如果实例化对象时又传递了类型,默认类型会被覆盖掉,跟函数参数是一样的
创建对象时需要传递模板参数列表,模板参数列表加在类名后面ClassNameclassN;如果类的模板参数列 表有默认值,可以不传模板参数,但一定要加<>如ClassName<>classN;创建堆区对象的时候,所有的类名称后面都要加模板参数列表,如ClassName
*classN=newClassName ;除了类内,其他地方出现ClassName的地方一般都要加模板参数列表
template//此处指定了模板默认参数,部分指定必须从右到左指定 classTest{ public: Test(Tt,Yy):t(t),y(y){ } voidtfunc(); private: Tt; Yy; }; template //类模板的函数在类外实现,需要加上模板参数列表,但不需要加指定的默认模板参数 voidTest ::tfunc(){//类外使用Test需要加模板参数 cout< test(n,d);//此处如果使用默认模板参数可定义为Test<>test(int(2),char('a')); test.tfunc(); //运行结果:22.1 类模板的继承,类模板被继承后参数的传递方式主要有两种,一种是直接在子类继承父类的时候,为父类指定固定的类型,二是通过子类模板参数列表传递
//======测试一====== templateclassA{ public: A(Tt,Yy){ } }; classTest:publicA {//父类是类模板,子类是普通类 public: Test():A (2,2.1){ } }; Test(); //======测试二====== template classA{ public: A(Tt){ } }; template classTest:publicA { public: Test(Xx,Zz,Pp):A (x){ } }; Test (int(2),double(2.1),char('a')); 类模板的多态,在创建对象时,分为子类没有模板(CFather
*cf=newCSon;)和子类有模板(CFather *cf=newCSon )两种,子类和父类的模板参数列表可以不一样,但一定要对应好
//======测试一====== templateclassA{ public: virtualvoidtfunc(Tt,Yy)=0; }; classTest:publicA { public: virtualvoidtfunc(intn,doubled){ cout< *a=newTest; a->tfunc(2,2.1); //运行结果:22.1 //======测试二====== template classA{ public: virtualvoidtfunc(Tt,Yy)=0; }; template classTest:publicA { public: virtualvoidtfunc(Xx,Pp){ cout< *a=newTest ; a->tfunc(2,2.1); //运行结果:22.1 类模板具体化,类模板的具体化分为部分具体化和全部具体化两种
templateclassTest{ public: Test(){ cout<<"T1andT2"< classTest { public: Test(){ cout<<"T1andint"< classTest { public: Test(){ cout<<"longandT2"< classTest { public: Test(){ cout<<"longandint"< (); Test (); Test (); Test (); 成员模板
成员模板简单说就是模板中的模板
classBase1{}; classBase2{}; classTest1:publicBase1{}; classTest2:publicBase2{}; templateclassPair{ public: T1t1; T2t2; Pair(T1t1,T2t2):t1(t1),t2(t2){ } //类模板中的成员模板 template Pair(constPair &pair):t1(pair.t1),t2(pair.t2){ } }; Pair (Pair (newTest1,newTest2)); 如果未特殊说明,以上测试均是在win10vs201764bit编译器下进行的
总结
以上所述是小编给大家介绍的C++泛型编程,希望对大家有所帮助!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。