标签:style blog color io os ar 使用 java for
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
模版可以分为两类,一个是函数模版,另外一个是类模版。
Java中对应的技术称为泛型。
函数模板:
格式:
1 template <class 形参名,class 形参名,......> 2 返回类型 函数名(参数列表) 3 { 4 函数体 5 }
其中template和class是关见字,class可以用typename 关见字代替,在这里typename 和class没区别,<>括号中的参数叫模板形参,模板形参和函数形参很相像,模板形参不能为空。
一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名。
例如:
1 #include <iostream> 2 3 using std::cout; 4 using std::endl; 5 6 //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替, 7 //T可以被任何字母或者数字代替。 8 template <class T> 9 T min(T x,T y) 10 { 11 return(x<y)?x:y; 12 } 13 14 void main( ) 15 { 16 int n1=2,n2=10; 17 double d1=1.5,d2=5.6; 18 cout<< "较小整数:"<<min(n1,n2)<<endl; 19 cout<< "较小实数:"<<min(d1,d2)<<endl; 20 system("PAUSE"); 21 }
类模板:
格式:
1 template<class 形参名,class 形参名,…> 2 class 类名 3 { 4 ... 5 };
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。
在类模板外部定义成员函数的方法为:
1 template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
例如比如有两个模板形参T1,T2的类A中含有一个void h()函数,则定义该函数的语法为:
1 template<class T1,class T2> void A<T1,T2>::h(){}
示例:
1 // ClassTemplate.h 2 #ifndef ClassTemplate_HH 3 4 #define ClassTemplate_HH 5 6 template<typename T1,typename T2> 7 8 class myClass{ 9 10 private: 11 12 T1 I; 13 14 T2 J; 15 16 public: 17 18 myClass(T1 a, T2 b);//Constructor 19 20 void show(); 21 22 }; 23 24 //这是构造函数 25 //注意这些格式 26 template <typename T1,typename T2> 27 myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){} 28 29 //这是void show(); 30 template <typename T1,typename T2> 31 void myClass<T1,T2>::show() 32 { 33 34 cout<<"I="<<I<<", J="<<J<<endl; 35 36 } 37 38 #endif 39 40 // Test.cpp 41 42 #include <iostream> 43 44 #include "ClassTemplate.h" 45 46 using std::cout; 47 48 using std::endl; 49 50 void main() 51 52 { 53 54 myClass<int,int> class1(3,5); 55 56 class1.show(); 57 58 myClass<int,char> class2(3,‘a‘); 59 60 class2.show(); 61 62 myClass<double,int> class3(2.9,10); 63 64 class3.show(); 65 66 system("PAUSE"); 67 68 }
模板的形参
(1)类型形参
类型形参由关见字class或typename后接说明符构成。
模板形参表示的是一个未知的类型。
模板类型形参可作为类型说明符用在模板中的任何地方,与内置类型说明符或类类型说明符的使用方式完全相同,即可以用于指定返回类型,变量声明等。
如:
1 template<class T> void h(T a){};//其中T就是一个类型形参,类型形参的名字由用户自已确定
(2)非类型形参
非类型模板形参的形参和实参间所允许的转换:
(3)模板形参(以模板作为模板的参数)
就是将一个模板作为另一个模板的参数。
例子:
1 Grid<int,vector<int> > myIntGrid;
注意其中int出现了两次,必须指定Grid和vector的元素类型都是int。
如果写成:
1 Grid<int,vector> myIntGrid;
因为vector本身就是一个模板,而不是一个类型,所以这就是一个模板模板参数。指定模板模板参数有点像在常规的函数中指定函数指针参数。
函数指针类型包括返回类型和函数的参数类型。在声明模板模板参数的时候也要包括完整的模板声明:
首先要知道作为参数的模板的原型,比如vector
1 template<typename E,typename Allocator=allocator<E> > 2 class vector 3 {...};
然后就可以定义:
1 template<typename T,template<typename E,typename Allocator=allocator<E> >class Container=vector> 2 class Grid 3 { 4 public: 5 //Omitted for brevity 6 Container<T>* mCells; 7 };
标签:style blog color io os ar 使用 java for
原文地址:http://www.cnblogs.com/hammerc/p/4030297.html