程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 模板的全特化與偏特化

模板的全特化與偏特化

編輯:C++入門知識

模板為什麼要特化,因為編譯器認為,對於特定的類型,如果你能對某一功能更好的實現,那麼就該聽你的。   模板分為類模板與函數模板,特化分為全特化與偏特化。全特化就是限定死模板實現的具體類型,偏特化就是如果這個模板有多個類型,那麼只限定其中的一部分。   先看類模板:     [cpp]
template<typename T1, typename T2>   class Test   {   public:       Test(T1 i,T2 j):a(i),b(j){cout<<"模板類"<<endl;}   private:       T1 a;       T2 b;   };      template<>   class Test<int , char>   {   public:       Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}   private:       int a;       char b;   };      template <typename T2>   class Test<char, T2>   {   public:       Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}   private:       char a;       T2 b;   };   [cpp] view plaincopyprint?template<typename T1, typename T2>   class Test   {   public:       Test(T1 i,T2 j):a(i),b(j){cout<<"模板類"<<endl;}   private:       T1 a;       T2 b;   };      template<>   class Test<int , char>   {   public:       Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}   private:       int a;       char b;   };      template <typename T2>   class Test<char, T2>   {   public:       Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}   private:       char a;       T2 b;   };     template<typename T1, typename T2> class Test { public: Test(T1 i,T2 j):a(i),b(j){cout<<"模板類"<<endl;} private: T1 a; T2 b; };   template<> class Test<int , char> { public: Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;} private: int a; char b; };   template <typename T2> class Test<char, T2> { public: Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;} private: char a; T2 b; }; 那麼下面3句依次調用類模板、全特化與偏特化:      [cpp] view plaincopyprint?Test<double , double> t1(0.1,0.2);   Test<int , char> t2(1,'A');   Test<char, bool> t3('A',true);   [cpp] view plaincopyprint?Test<double , double> t1(0.1,0.2);   Test<int , char> t2(1,'A');   Test<char, bool> t3('A',true);     Test<double , double> t1(0.1,0.2); Test<int , char> t2(1,'A'); Test<char, bool> t3('A',true); 而對於函數模板,卻只有全特化,不能偏特化:      [cpp] view plaincopyprint?//模板函數    template<typename T1, typename T2>   void fun(T1 a , T2 b)   {       cout<<"模板函數"<<endl;   }      //全特化    template<>   void fun<int ,char >(int a, char b)   {       cout<<"全特化"<<endl;   }      //函數不存在偏特化:下面的代碼是錯誤的    /*  template<typename T2>  void fun<char,T2>(char a, T2 b)  {      cout<<"偏特化"<<endl;  }  */   [cpp] view plaincopyprint?//模板函數    template<typename T1, typename T2>   void fun(T1 a , T2 b)   {       cout<<"模板函數"<<endl;   }      //全特化    template<>   void fun<int ,char >(int a, char b)   {       cout<<"全特化"<<endl;   }      //函數不存在偏特化:下面的代碼是錯誤的    /*  template<typename T2>  void fun<char,T2>(char a, T2 b)  {      cout<<"偏特化"<<endl;  }  */     //模板函數 template<typename T1, typename T2> void fun(T1 a , T2 b) { cout<<"模板函數"<<endl; }   //全特化 template<> void fun<int ,char >(int a, char b) { cout<<"全特化"<<endl; }   //函數不存在偏特化:下面的代碼是錯誤的 /* template<typename T2> void fun<char,T2>(char a, T2 b) { cout<<"偏特化"<<endl; } */ 至於為什麼函數不能偏特化,似乎不是因為語言實現不了,而是因為偏特化的功能可以通過函數的重載完成。   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved