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

C++的模板特化 和 STL中iterator_traits模板的偏特化,stliterator_traits

編輯:C++入門知識

C++的模板特化 和 STL中iterator_traits模板的偏特化,stliterator_traits


C++中有類模板和函數模板,它們的定義如下所示:

類模板:

template<class T1,class T2>  
class C  
{  
//...  
};  

函數模板:

template<class T1,class T2>  
void func(T1 p1,T2 p2)  
{  
//...  
}; 

特化包括全特化和偏特化,全特化也叫簡稱特化,所以說特化的時候意思就是全特化。

特化就是對所有的模板參數指定一個特定的類型,偏特化就是對部分模板參數指定特定的類型。

類模板的特化:

template<class T1,class T2> //這裡是類模板  
class C  
{  
//...  
};  
  
template<>  //這裡是對C的特化  
class C<int,int>  
{  
//...  
};  

從語法上看,全特化的時候,template後面尖括號裡面的模板參數列表必須是空的,表示該特化版本沒有模板參數,全部都被特化了。

類模板的偏特化:

template<class T1,class T2> //這裡是類模板  
class C  
{  
//...  
};  
  
template <class T1>  //這裡是對C的偏特化  
class C<T1,int>  
{  
//...  
};  

從語法上看,偏特化的時候,template後面的尖括號裡面的模板參數列表必須列出未特化的模板參數。同時在C後面要全部列出模板參數,同時指定特化的類型,比如指定int為T2的特化類型。

函數模板的特化:

template<class T1,class T2>  //這裡是函數模板  
void func(T1 p1,T2 p2)  
{  
//...  
};  
  
template <>  //這裡是對函數模板的特化  
void func(int p1,int p2)  
{  
//...  
};  

函數模板的偏特化:

 函數模板不能進行偏特化!!!!!

//--------------------------------------------------------

STL中iterator_traits的偏特化 

STL中的iterator_traits用來返回iterator中定義好的五種類型。其具體實現應該是:

template<class Iterator>
struct iterator_traits
{
    typedef typename Iterator::difference_type difference_type;
    typedef typename Iterator::value_type value_type;
    typedef typename Iterator::pointer pointer;
    typedef typename Iterator::reference reference;
    typedef typename Iterator::iterator_category iterator_category;
};

因為指針也是一種iterator,如果將指針作為模板參數,上面的定義就會失效。因此上面的模板必須對指針進行特化。特化的代碼如下所示:

template<class T>
struct iterator_traits<T*>
{
    typedef ptrdiff_t difference_type;
    typedef T value_type;
    typedef T* pointer;
    typedef T& reference;
    typedef random_access_iterator_tag iterator_category;
};

而且還需要對 const T*  進行特化,否則 value_type 就成了  const T  類型,這通常不是我們想要的.

template<class T>
struct iterator_traits<const T*>
{
    typedef ptrdiff_t difference_type;
    typedef T value_type;
    typedef const T* pointer;
    typedef const T& reference;
    typedef random_access_iterator_tag iterator_category;
};

內容主要來自: http://blog.csdn.net/timewalker08/article/details/7195698

 

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