模板由于模板元编程需要以面向对象为基础所以如有疑问之处可以先补充一点C面向对象的知识C面向对象这一篇就够了泛型初步由于C是静态强类型语言所以变量一经创建则类型不得更改。如果我们希望创建一种应用广泛地复数类型那么相应地需要基于int、float、double这些基础类型逐一创建十分麻烦。泛型编程便是为了简化这一过程而生。能够容纳不同数据类型作为成员的类被成为模板类其基本方法为在类声明的上面加上一行模板声明代码templatetypename T下一行为class myClass其调用过程为myClassT m。列举案例如下123456789101112131415161718192021222324252627#includeiostreamusingnamespacestd;templatetypenameCstructAbstract{C real;//real为C类型C im;Abstract(C inReal, C inIm){real inReal;im inIm;}voidprintVal(){coutAbstract:realimiendl;};Abstract multi(Abstract val){C temp real*val.real - im*val.im;im real*val.real im*val.im;real temp;return*this;};};intmain(){Abstractfloat fTemp{1,2};//C类型为floatfTemp.multi(fTemp);fTemp.printVal();system(pause);return0;}函数模板当然上述multi并不能实现两个不同类型的Abstract之间的相乘所以可以将multi函数改为1234567templatetypenameTAbstractC multi(AbstractT val){C temp real*val.real - im*val.im;im real*val.real im*val.im;real temp;return*this;}这样就能够实现如下功能。123456789intmain(){Abstractfloat fTemp{1,2};Abstractint iTemp{1,2};fTemp.multi(iTemp);fTemp.printVal();getReal(fTemp);system(pause);return0;}友元模板类具备一部分普通类的性质比如struct和class的区别public、protected、private的性质以及友元等。模板的声明特性也可以应用在函数中例如12345678910111213141516171819202122232425262728293031323334#includeiostreamusingnamespacestd;templatetypenameCclassAbstract{C real;C im;public:Abstract(C inReal, C inIm){real inReal;im inIm;}voidprintVal(){coutAbstract:realimiendl;};Abstract multi(Abstract val){C temp real*val.real - im*val.im;im real*val.real im*val.im;real temp;return*this;}templatetypenameTfriendvoidgetReal(AbstractT num);//声明友元};templatetypenameCvoidgetReal(AbstractC num){coutnum.realendl;}intmain(){Abstractfloat fTemp{1,2};fTemp.multi(fTemp);fTemp.printVal();getReal(fTemp);system(pause);return0;}需要注意的一点是在模板类中声明友元其前缀typename T中的类型标识不得与已有的类型标识重复否则编译无法通过。由于函数模板可以针对不同的数据类型进行求解操作是对函数或者方法实例的抽象所以又被称为算法。模板参数如果将模板理解为一种类型声明的函数那么模板也应该具备一些函数具备的功能。首先其模板参数中可以包含实际类型参数例如12templatetypenameT,intmaxclassTest{}其调用时可以写为1Testint,256 pixel;模板同样支持默认参数即可以实现如下形式123templatetypenameTint,intmax256classTest{}Test pixle;除了数据类型、值之外模板本身也可以作为模板参数例如下面的形式是合法的。1234567891011121314templatetypenameT,templatetypenameclassCstructTest{CT* val;Test(CT* inVal){val inVal;}};intmain(){Abstractint fTemp{1,2};Testint,Abstract test(fTemp);test.val-printVal();system(pause);return0;}其结果为1234PS E:\Code\cpp g .\generic.cppPS E:\Code\cpp .\a.exeAbstract:12i请按任意键继续. . .需要注意的一点是在模板类中定义的模板类需要进行实例化否则会出现错误所以在Test中以指针形式创建了模板类。类型函数以数据类型为输入或输出的函数即为类型函数在C语言中sizeof便是一种类型函数其输入为数据类型输出为数据类型所需要的内存空间。在C11中using可以实现数据类型赋予的功能其使用方法与typedef相似1234templatetypenameTstructTest{usingtype T;}元编程的基本概念元编程是泛型编程的一个超集两者的本质均是针对不同数据类型的算法后者则更关注传入参数的广泛性。如果将元编程分为四个层次无计算运算符连接的运算编译时具备选择等非递归计算编译时具备递归运算那么泛型编程可以作为第一类元编程或者说更加关注的是参数的传入传出过程而元编程则更关注不同数据类型的选择过程。例如我们可以实现一个最多包含三个元素的元组Tuple其思路为三元元素可以看成是一个二元元组与一个参数的组合二元元组可以看成是一元元组与参数的组合一元元组则是一个基本数据类型的变量。在这个元组的实现过程中除了赋值过程实现泛型之外也需要判断当前所实现的元组元素个数如果其初始化参量为3个时需要递归式地创建变量直到赋值参数为1个。则其实现如下123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354classNil{};//主模板templatetypenameT1Nil,typenameT2Nil,typenameT3NilstructTuple : TupleT2,T3{T1 x;usingBase TupleT2,T3;//三元元组以二元元组为基础//返回值为TupleT2,T3指针类型的base()函数//static_cast将this转化为Base*类型Base* base(){returnstatic_castBase*(this);}constBase* base()const{returnstatic_castconstBase*(this);}//构造函数继承二元元组在构造本类中x的同时构造基类TupleT2,T3Tuple(constT1 t1,constT2 t2,constT3 t3):Base{t2,t3},x{t1}{}};templatetypenameT1structTupleT1{T1 x;};templatetypenameT1,typenameT2structTupleT1,T2 : TupleT2{T1 x;usingBase TupleT2;Base* base(){returnstatic_castconstBase*(this);}constBase* base()const{returnstatic_castconstBase*(this);}Tuple(constT1 t1,constT2 t2):Base{t2}, x{t1}{}};templatetypenameT1,typenameT2,typenameT3voidprint_elements(ostream os,constTupleT1,T2,T3 t){ost.x,;print_elements(os,*t.base());}templatetypenameT1,typenameT2voidprint_elements(ostream os,constTupleT1,T2 t){ost.x,;print_elements(os,*t.base());}templatetypenameT1voidprint_elements(ostream os,constTupleT1 t){ost.x;}//运算符重载templatetypenameT1,typenameT2,typenameT3ostream operator(ostream os,constTupleT1,T2,T3 t){os{;print_elements(os,t);os};returnos;}intmain(){Tupleint,double,char x{1,2.5,a};coutxendl;system(pause);return0;}其输出结果为123PS E:\Code\cpp g .\generic.cppPS E:\Code\cpp .\a.exe{1,2.5,a}可变参数模板上述实现过程非常繁琐而且限制了元组中的元素个数如果标准库中用上述的书写风格那么标准库除了这个元组之外也写不了其他的东西了。好在C模板提供了可变参数的功能例如我们可以先将打印模板函数写为1234567891011121314151617//typename... T 代表可变参数templatetypenameT1,typename... Tvoidprint_elements(ostream os,constTupleT1,T... t){ost.x,;print_elements(os,*t.base());}templatetypenameT1voidprint_elements(ostream os,constTupleT1 t){ost.x;}templatetypename... Tostream operator(ostream os,constTupleT... t){os{;print_elements(os,t);os};returnos;}其输出结果为1234PS E:\Code\cpp g .\generic.cppPS E:\Code\cpp .\a.exe{1,2.5,a}请按任意键继续. . .然后将Tuple也做相同的更改12345678910111213141516171819202122templatetypenameT1,typename... TstructTuple : TupleT...{T1 x;usingBase TupleT...;//N1元元组以N元元组为基Base* base(){returnstatic_castBase*(this);}constBase* base()const{returnstatic_castconstBase*(this);}//注意T...的书写格式Tuple(constT1 t1,constT... t):Base{t...},x{t1}{}};templatetypenameTstructTupleT{T x;};/*print模板*/intmain(){Tuplestring,double,int,char tt(hello,1.5,1,a);coutttendl;system(pause);return0;}其输出结果为123PS E:\Code\cpp g .\generic.cppPS E:\Code\cpp .\a.exe{hello,1.5,1,a}以上就是C元编程语言初步入门详解的详细内容https://gitee.com/connectivities/tya/blob/master/54237.mdhttps://gitee.com/connectivities/tya/blob/master/20602.mdhttps://gitee.com/connectivities/tya/blob/master/52367.mdhttps://gitee.com/connectivities/tya/blob/master/47422.mdhttps://gitee.com/connectivities/tya/blob/master/57141.mdhttps://gitee.com/connectivities/tya/blob/master/07437.mdhttps://gitee.com/connectivities/tya/blob/master/95248.mdhttps://gitee.com/connectivities/tya/blob/master/76032.mdhttps://gitee.com/connectivities/tya/blob/master/42074.mdhttps://gitee.com/connectivities/tya/blob/master/30865.mdhttps://gitee.com/connectivities/tya/blob/master/36678.mdhttps://gitee.com/connectivities/tya/blob/master/65456.mdhttps://gitee.com/connectivities/tya/blob/master/74003.mdhttps://gitee.com/connectivities/tya/blob/master/17541.mdhttps://gitee.com/connectivities/tya/blob/master/54205.mdhttps://gitee.com/connectivities/tya/blob/master/16874.mdhttps://gitee.com/connectivities/tya/blob/master/94337.mdhttps://gitee.com/connectivities/tya/blob/master/74043.mdhttps://gitee.com/connectivities/tya/blob/master/88750.mdhttps://gitee.com/connectivities/tya/blob/master/56345.mdhttps://gitee.com/connectivities/tya/blob/master/38660.mdhttps://gitee.com/connectivities/tya/blob/master/79702.mdhttps://gitee.com/connectivities/tya/blob/master/83144.mdhttps://gitee.com/connectivities/tya/blob/master/78940.mdhttps://gitee.com/connectivities/tya/blob/master/13017.mdhttps://gitee.com/connectivities/tya/blob/master/67753.mdhttps://gitee.com/connectivities/tya/blob/master/91962.mdhttps://gitee.com/connectivities/tya/blob/master/16958.mdhttps://gitee.com/connectivities/tya/blob/master/47307.mdhttps://gitee.com/connectivities/tya/blob/master/87270.mdhttps://gitee.com/connectivities/tya/blob/master/14313.mdhttps://gitee.com/connectivities/tya/blob/master/25631.mdhttps://gitee.com/connectivities/tya/blob/master/61303.mdhttps://gitee.com/connectivities/tya/blob/master/75642.mdhttps://gitee.com/connectivities/tya/blob/master/48193.mdhttps://gitee.com/connectivities/tya/blob/master/26641.mdhttps://gitee.com/connectivities/tya/blob/master/57582.mdhttps://gitee.com/connectivities/tya/blob/master/94225.mdhttps://gitee.com/connectivities/tya/blob/master/03515.mdhttps://gitee.com/connectivities/tya/blob/master/91198.mdhttps://gitee.com/connectivities/tya/blob/master/91075.mdhttps://gitee.com/connectivities/tya/blob/master/19372.mdhttps://gitee.com/connectivities/tya/blob/master/29872.mdhttps://gitee.com/connectivities/tya/blob/master/46652.mdhttps://gitee.com/connectivities/tya/blob/master/64075.mdhttps://gitee.com/connectivities/tya/blob/master/97641.mdhttps://gitee.com/connectivities/tya/blob/master/34912.mdhttps://gitee.com/connectivities/tya/blob/master/16145.mdhttps://gitee.com/connectivities/tya/blob/master/81376.mdhttps://gitee.com/connectivities/tya/blob/master/71117.mdhttps://gitee.com/connectivities/tya/blob/master/84210.mdhttps://gitee.com/connectivities/tya/blob/master/42359.mdhttps://gitee.com/connectivities/tya/blob/master/81196.mdhttps://gitee.com/connectivities/tya/blob/master/35250.mdhttps://gitee.com/connectivities/tya/blob/master/02258.mdhttps://gitee.com/connectivities/tya/blob/master/68976.mdhttps://gitee.com/connectivities/tya/blob/master/16133.mdhttps://gitee.com/connectivities/tya/blob/master/86764.mdhttps://gitee.com/connectivities/tya/blob/master/20873.mdhttps://gitee.com/connectivities/tya/blob/master/39985.md