類别範本繼承和部分具體化例子及非型別引數

gaopengtttt發表於2016-08-30
模板類必須所有的方法定義放到一個檔案中。因為模板類不是函式不能單獨編譯

template<typename T1,typename T2,int T3>
class myext:public mybase<T2>
模板定義兩個型別引數T1,T2,定義個非型別引數T3,他在使用期間如同一個常數。這個T3可以用來處理動態陣列,並且繼承了模板類mybase並且將型別引數T2賦予給他
template<typename T2,int T3>
class myext<int,T2,T3>:public mybase<T2>
模板定義一個型別引數T2,定義一個非型別引數T3,那麼這裡的T2就代表他是泛型的,而不具體化,但是開始的T1變為了具體化的int,並且繼承了模板類mybase並且將型別引數T2賦予給他

template<typename T1,typename T2,int T3>
void myext<T1,T2,T3>::set(const T1 &in)
這是第一個模板類定義方法的方法

template<typename T2,int T3>
void myext<int,T2,T3>::set(const int &in)
這是第二個模板類定義方法的方法

呼叫:
myext<string,string,4> test2("test","gaopeng"); 將匹配template<typename T1,typename T2,int T3> class myext:public mybase<T2>
myext<int,int,10> test1(1,1); 將匹配template<typename T2,int T3> class myext<int,T2,T3>:public mybase<T2>
具體化過後當然選擇的方法是選擇匹配程度最高的模板。
下面是具體的測試程式碼沒有實際意義:


點選(此處)摺疊或開啟

  1. 標頭檔案
  2. tmp.h
  3. #include<iostream>
  4. using namespace std;

  5. template<typename T1>
  6. class mybase
  7. {
  8.         private:
  9.                 T1 a;
  10.         public:
  11.                 mybase(T1 in)
  12.                 {
  13.                         a=in;
  14.                 }
  15.                 virtual void show(void) const
  16.                 {
  17.                         cout<<a<<endl;
  18.                 }
  19.                 virtual ~mybase(){}
  20. };

  21. template<typename T1,typename T2,int T3>
  22. class myext:public mybase<T2>
  23. {
  24.         private:
  25.                 T1 b;
  26.         public:
  27.                 myext(T1 in1,T2 in2):mybase<T2>(in2)
  28.         {
  29.                 b=in1;
  30.         }
  31.                 virtual void show(void) const
  32.                 {
  33.                         for(int i=0;i<T3;i++)
  34.                         cout<<b<<endl;
  35.                         mybase<T2>::show();
  36.                 }
  37.                 virtual ~myext(){}

  38.                 virtual void set(const T1&);
  39. };

  40. template<typename T1,typename T2,int T3>
  41. void myext<T1,T2,T3>::set(const T1 &in)
  42. {
  43.         b=in;
  44.         for(int m=0;m<T3;m++)
  45.         {
  46.                 cout<<"test"<<endl;
  47.         }
  48. }

  49. template<typename T2,int T3>
  50. class myext<int,T2,T3>:public mybase<T2>
  51. {
  52.         private:
  53.                 int b;
  54.         public:
  55.                 myext(int in1,T2 in2):mybase<T2>(in2)
  56.         {
  57.                 b=in1+100;
  58.         }
  59.                 virtual void show(void) const
  60.                 {
  61.                         for(int i=0;i<T3;i++)
  62.                                 cout<<b<<endl;
  63.                         mybase<T2>::show();
  64.                 }
  65.                 virtual ~myext(){}
  66.                 virtual void set(const int&);
  67. };
  68. template<typename T2,int T3>
  69. void myext<int,T2,T3>::set(const int &in)
  70. {
  71.         b=in+100;
  72.         for(int m=0;m<T3;m++)
  73.         {
  74.                 cout<<"test1"<<endl;
  75.         }
  76. }


點選(此處)摺疊或開啟

  1. main函式

  2. #include<iostream>
  3. #include"tmp.h"
  4. using namespace std;


  5. int main(void)
  6. {
  7.         cout<<"use specialization template"<<endl;
  8.         myext<int,int,10> test1(1,1);
  9.         test1.set(10);
  10.         test1.show();
  11.         cout<<"use general template"<<endl;
  12.         myext<string,string,4> test2("test","gaopeng");
  13.         test2.show();
  14. }
輸出:
use specialization template
test1
test1
test1
test1
test1
test1
test1
test1
test1
test1
110
110
110
110
110
110
110
110
110
110
1
use general template
test
test
test
test
gaopeng

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2124228/,如需轉載,請註明出處,否則將追究法律責任。

相關文章