Template.doc_第1页
Template.doc_第2页
Template.doc_第3页
Template.doc_第4页
Template.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Templates 定义一个模板使用的关键字:class和typename。在定义作为模板的时候:class和typename,作用是一样的。一 函数模板1 定义方式template function_declaration;template function_declaration;2 Exampletemplate T GetMax (T a, T b) T result;result = (ab)? a : b;return (result);3 使用方法function_name (parameters);int x,y;GetMax (x,y);对于内部类型,通常是可以无需制定具体的类型,编译器会自动识别,而是写成:int x,y;GetMax(x,y);/x,y为相同的类型int x;long y;GetMax(x,y);/x,y为不相同的类型 报错 两种不同的内部类型必须:template T GetMin (T a, U b) return (ab?a:b);int i,j;long l;i = GetMin (j,l);/或者i = GetMin (j,l);二 Class Template通常是使用模板作为类成员变量的类型1 Example:template class mypair T values 2; public: mypair (T first, T second)/内联函数 values0=first; values1=second; ;mypair myobject (115, 36);/这样使用mypair myfloats (3.0, 2.18);2 成员函数为非内联函数template class mypair T a, b; public: mypair (T first, T second) a=first; b=second; T getmax ();template /增加此声明T mypair:getmax () T retval; retval = ab? a : b; return retval;int main () mypair myobject (100, 75); cout myobject.getmax(); return 0;模板类成员函数外部定义方法:template T mypair:getmax ()三 模板特化 Template Specialization1 将模板类转化为特定类型相关的类/ class template:template class mycontainer T element; public: mycontainer (T arg) element=arg; T increase () return +element;/ class template specialization:template /class mycontainer /将其特例化为char型 char element; public: mycontainer (char arg) element=arg; char uppercase () if (element=a)&(element=z) element+=A-a; return element; ;int main () mycontainer myint (7); mycontainer mychar (j); cout myint.increase() endl; cout mychar.uppercase() endl; return 0;template class mycontainer . ;/模板类template class mycontainer . ;/特例化为char型template class mycontainer . ;/特例化为int型模板来与之相应的特例化的类之间,并不是什么继承关系,所以在特例化一个模板类时,需要将其所有的包含成员进行重写,可以进行扩展。2 非模板类型参数Non-type parameters for templatestemplate /int Nclass mysequence T memblock N; public: void setmember (int x, T value); T getmember (int x);template void mysequence:setmember (int x, T value) memblockx=value;template T mysequence:getmember (int x) return memblockx;int main () mysequence myints; mysequence myfloats; myints.setmember (0,100); myfloats.setmember (3,3.1416); cout myints.getmember(0) n; cout myfloats.getmember(3) n; return 0;可以设置模板类型的缺省值:template class mysequence .;mysequence myseq;/可以缺省使用 mysequence myseq;/等同于上面四 Templates and multiple-file projectsFrom the point of view of the compiler, templates are not normal functions or classes. They are compiled on demand, meaning that the code of a template function is not compiled until an instantiation with specific template arguments is required. At that moment, when an instantiation is required, the compiler generates a function specifically for those arguments from the template.模板不会在代码编译的时候直接进行编译,而是在被实例化一个特定类型的模板时候,才会编译到,生成一个特定参数的函数。When projects grow it is usual to split the code of a program in different source code files. In these cases, the interface and implementation are generally separated. Taking a library of functions as example, the interface generally consists of declarations of the prototypes of all the functions that can be called. These are generally declared in a header file with a .h extension, and the implementation (the definition of these functions) is in an independent file with c+ code. Because templates are compiled when required, this forces a restriction for multi-file projects: the implementation (definition) of a template class or function must be in the same file as its declaration. That means that we cannot separate the interface in a separate header file, and that we must include both interface and implementation in any file that uses the templates. 由于模板特殊的编译需要,模板类的定义和函数实现必须在同一个文件中进行。Since no code is generated until a template is instantiated when required, compilers are prepared to allow the inclusion more than once of the same template file with both declarations and definitions in a project without generating linkage errors.二 typename定义一个模板使用的关键字:class和typename。在定义作为模板的时候:class和typename,作用是一样的。使用typename,实际上也是为模板服务的,在某些情况下我们需要明确的指出某些变量为模板。1 在一个模板类中使用另一个模板类定义一个变量时templatestruct first typedef T * pointer;templateclass second first:pointer p; / syntax error (VC+中 并不报错);In a template, the name of a member of another class that depends on its template parameter(s) (first:pointerin this example, dependent on theTparameter) is adependent namethat i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论