C++ Traits

STL 偏特化設(shè)計(jì)

概念:如果class template 中存在一個(gè)或者多個(gè)template參數(shù),可以針對(duì)其中某個(gè)或者幾個(gè)洒闸,但不是全部的template參數(shù)進(jìn)行特化工作檀蹋。
  1. 迭代器型別 value_type,指的是迭代器所指的對(duì)象的型別
    typedef T value_type
  2. difference_type 表示兩個(gè)迭代器之間的距離耻台,可以用來表示一個(gè)容器的最大容量(連續(xù)空間上,頭尾之間的距離)刑然,stl中的count(),表示的結(jié)果就是difference_type
    typedef typename T::difference_type difference_type 一般情況
    typedef ptrdiff_t difference_type 原生指針
    //任何時(shí)候需要任何迭代器I 的difference_type 可以寫成
    typename iterator_traits<I>::difference_type
    
  3. reference type 引用類型
    typedef T& reference;
  4. pointer type 指針類型
    typedef T& pointer;
  5. iterator_category; 標(biāo)記類型
    typedef xxx_iterator_tag iterator_category;

例如:

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

注意點(diǎn):

  • 設(shè)計(jì)了五個(gè)標(biāo)簽:
    struct input_iterator_tag {}; //只讀
    struct output_iterator_tag {}; //只寫
    struct forward_iterator_tag : public input_iterator_tag {}; // 可讀寫
    struct bidirectional_iterator_tag : public forward_iterator_tag {}; // 雙向移動(dòng)
    struct random_access_iterator_tag : public bidirectional_iterator_tag {}; // 隨機(jī)讀寫省古,即是所有可操作行為

  • 標(biāo)簽用來標(biāo)記重載函數(shù)特征例如

     template <class InputIterator, class Distance>
     inline void __advance(InputIterator& i, Distance n, input_iterator_tag) {
      //逐一前進(jìn)
       while (n--) ++i;
     }
     template <class BidirectionalIterator, class Distance>
     inline void __advance(BidirectionalIterator& i, Distance n, 
     bidirectional_iterator_tag) {
     if (n >= 0)
     while (n--) ++i;
       else
     while (n++) --i;
     }
    
     template <class RandomAccessIterator, class Distance>
     inline void __advance(RandomAccessIterator& i, Distance n, 
                           random_access_iterator_tag) {
       i += n;
     }
    

    以及計(jì)算兩個(gè)迭代器的distance()函數(shù)

  • 以上兩者詮釋了迭代器分為五類的設(shè)計(jì)與應(yīng)用隐砸,利用iterator_traits城看,將迭代器萃取出來,結(jié)果就是講類似的進(jìn)行標(biāo)記佛南,然后通過各個(gè)iterator_traits形式通過內(nèi)嵌的類型,和template進(jìn)行參數(shù)推導(dǎo),尤其是iterator_category等提取驗(yàn)證

  • taits,通過將類型等信息聲明為局部變量紊遵,對(duì)外接口func,實(shí)際操作有funcImpl執(zhí)行,根據(jù)funcImpl的參數(shù)類型進(jìn)行推導(dǎo)侥蒙,沒有返回值的易于理解處理暗膜,可以直接通過參數(shù)個(gè)數(shù),參數(shù)誒下進(jìn)行處理 模板參數(shù)類型推導(dǎo)

    template<typename Iterator>
    typename Iterator::value_type  //返回類型
    function(Iterator iter)
    {
    return *iter;
    }
     
    //通過iterator_traits作用后的版本
    template<typename Iterator>
    typename iterator_traits<Iterator>::value_type  //返回類型
    function(Iterator iter)
    { 
    return *iter;
    }  

利用typename告訴編譯器這是個(gè)類型鞭衩,保證編譯順利学搜,指針沒辦法進(jìn)行定義內(nèi)嵌的類型(value_type等)通過特化處理,就是直接將<T*>進(jìn)行替代<T>進(jìn)行特化處理

  • 繼承迭代處理
    template <typename T>
    class ListIter : public std::iterator<std::forward_iterator_tag, T>
    {
        
    }

標(biāo)記登記

  1. 標(biāo)記目標(biāo)函數(shù)(一般模板)具備的特性论衍,返回類型瑞佩,傳入類型類別
  2. 登記目標(biāo)函數(shù)(特化模板)傳入?yún)?shù)的特征,返回特征坯台,返回標(biāo)記

template <class type>
struct __type_traits { 
   typedef __true_type     this_dummy_member_must_be_first;
   typedef __false_type    has_trivial_default_constructor;
   typedef __false_type    has_trivial_copy_constructor;
   typedef __false_type    has_trivial_assignment_operator;
   typedef __false_type    has_trivial_destructor;
   typedef __false_type    is_POD_type;
};

has_trivial_xxx:判斷準(zhǔn)則:class內(nèi)含指針成員炬丸,并且對(duì)改成員進(jìn)行了內(nèi)存動(dòng)態(tài)配置,分配的操作類型判定has_trivial_xxx

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稠炬,隨后出現(xiàn)的幾起案子焕阿,更是在濱河造成了極大的恐慌,老刑警劉巖首启,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暮屡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毅桃,警方通過查閱死者的電腦和手機(jī)褒纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疾嗅,“玉大人外厂,你說我怎么就攤上這事〈校” “怎么了汁蝶?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)论悴。 經(jīng)常有香客問我掖棉,道長(zhǎng),這世上最難降的妖魔是什么膀估? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任幔亥,我火速辦了婚禮,結(jié)果婚禮上察纯,老公的妹妹穿的比我還像新娘帕棉。我一直安慰自己,他們只是感情好饼记,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布香伴。 她就那樣靜靜地躺著,像睡著了一般具则。 火紅的嫁衣襯著肌膚如雪即纲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天博肋,我揣著相機(jī)與錄音低斋,去河邊找鬼。 笑死匪凡,一個(gè)胖子當(dāng)著我的面吹牛膊畴,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播病游,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巴比,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起轻绞,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤采记,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后政勃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唧龄,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年奸远,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了既棺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懒叛,死狀恐怖丸冕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情薛窥,我是刑警寧澤胖烛,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站诅迷,受9級(jí)特大地震影響佩番,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜罢杉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一趟畏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滩租,春花似錦赋秀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜘欲,卻和暖如春益眉,著一層夾襖步出監(jiān)牢的瞬間晌柬,已是汗流浹背姥份。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留年碘,地道東北人澈歉。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像屿衅,于是被迫代替她去往敵國和親埃难。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容