C++ 模板详解

1. 模板的概

    我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。

  1. //函数1.int max(int x,int y);
  2. {
  3.     return(x>y)?x:y ;
  4. }
  5. //函数2.float max( float x,float y)
  6. {
  7.     return (x>y)? x:y ;
  8. }
  9. //函数3.double max(double x,double y)
  10. {
  11.     return (c>y)? x:y ;
  12. }

    但如果在主函数中,我们分别定义了 char a,b; 那么在执行max(a,b);时 程序就会出错,因为我们没有定义char类型的重载版本。

    现在,我们再重新审视上述的max()函数,它们都具有同样的功能,即求两个数的最大值,能否只写一套代码解决这个问题呢?这样就会避免因重载函数定义不 全面而带来的调用错误。为解决上述问题C++引入模板机制,模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。

2.   函数模板的写法

函数模板的一般形式如下

  1. Template <class或者也可以用typename T>
  2. 返回类型 函数名(形参表)
  3. {
  4.     //函数定义体 
  5. }

    说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

请看以下程序:

  1. //Test.cpp
  2. #include <iostream>
  3. using std::cout;
  4. using std::endl;

//声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,

//T可以被任何字母或者数字代替。

  1. template <class T>
  2. T min(T x,T y)
  3. { 
  4.     return(x<y)?x:y;
  5. }
  6. void main( )
  7. {
  8. int n1=2,n2=10;
  9.     double d1=1.5,d2=5.6;
  10. cout<< "较小整数:"<<min(n1,n2)<<endl;
  11.     cout<< "较小实数:"<<min(d1,d2)<<endl;
  12.     system("PAUSE");
  13. }

    程序分析:main()函数中定义了两个整型变量n1 , n2 两个双精度类型变量d1 , d2然后调用min( n1, n2); 即实例化函数模板T min(T x, T y)其中T为int型,求出n1,n2中的最小值.同理调用min(d1,d2)时,求出d1,d2中的最小值.

3. 类模板的写法

定义一个类模板:

  1. Template < class或者也可以用typename T >
  2. class类名{
  3.     //类定义......
  4. };

    说明:其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

例如:定义一个类模板:

  1. // ClassTemplate.h
  2. #ifndef ClassTemplate_HH
  3. #define ClassTemplate_HH
  4. template<typename T1,typename T2>
  5. class myClass{
  6.     private:
  7.     T1 I;
  8.     T2 J;
  9.     public:
  10.     myClass(T1 a, T2 b);//Constructor
  11.     void show();
  12. };
  13. //这是构造函数
  14. //注意这些格式
  15. template <typename T1,typename T2>
  16. myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
  17. //这是void show();
  18. template <typename T1,typename T2>
  19. void myClass<T1,T2>::show()
  20. {
  21. cout<<"I="<<I<<", J="<<J<<endl;
  22. }
  23. #endif
  24. // Test.cpp
  25. #include <iostream>
  26. #include "ClassTemplate.h"
  27. using std::cout;
  28. using std::endl;
  29. void main()
  30. {
  31. myClass<int,int> class1(3,5);
  32. class1.show();
  33. myClass<int,char> class2(3,'a');
  34. class2.show();
  35. myClass<double,int> class3(2.9,10);
  36. class3.show();
  37. system("PAUSE");
  38. }


4.非类型模版参数

一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

    转自:http://www.360doc.com/content/09/0403/17/799_3011262.shtml

  1. template<typename T, int MAXSIZE>
  2. class Stack{
  3.     Private:
  4. T elems[MAXSIZE];
  5.         …
  6. };
  7. Int main()
  8. {
  9. Stack<int, 20> int20Stack;
  10. Stack<int, 40> int40Stack;
  11.     …
  12. };
阅读更多
换一批

没有更多推荐了,返回首页