亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

解讀C++編程中類模板的三種特化

2020-01-26 14:47:03
字體:
來源:轉載
供稿:網友

1.類模板顯式特化
為了進行特化,首先需要一個通用的版本,稱主模板.主模板使用了標準庫堆算法.  堆 是一種線性化的樹形結構,將一個值壓入一個堆中, 實際上等于將該值插入到一個樹形結構中;將一個值從堆中取出就等于移除并返回堆中最大值.但在處理字符的指針時會碰釘子.堆將按照指針的值進行組織. 我們可以提供一個顯式特化版本解決此問題(例1)如果希望除了一個針對const char*的Heap外,還希望提供一個針對char *的Heap;(例2)

//主模板template <typename T>class Heap{private:  std::vector<T> h_;public:  void push(const T& val);  T pop();  bool empty() const //const聲明在末尾表示該函數不能修改類變量  {    return h_.empty();  }}template <typename T>void Heap<T>::push(const T& val){  h_.push_back(val);  std::push_heap(h_.begin(),h_.end());}template <typename T>T Head<T>::pop(){  std::pop_head(h_.begin(),h_.end());  T tmp(h_.back());  h_.pop_back();  return tmp;}

例1

//顯示特化版本/*********************************************** *     可以看到模板參數列表是空的,其實這根本不是一個模 *  板. 因為沒有指定任何模板參數.所以模板的顯式特化又被 *  稱作"完全特化". *     Heap<const char*> 完全特化,不會導致模板的實例化; *     Heap<int> 特化,會導致模板的實例化; *     編譯器根據主模板的聲明來檢查類模板特化.***********************************************/template<>//注意,無任何參數,當然,它本來就不是一個模板class Head<const char *>{private:  std::vector<const char *> h_;public:  void push(const char *pval);  const char * pop();  bool empty() const //const聲明在末尾表示該函數不能修改類變量  {    return h_.empty();  }};//再次提醒, Head<const char *>不是一個模板void Heap<const char*>::push(const char *pval){  h_.push_back(pval);  std::push_heap(h_.begin(),h_.end());}

例2

/*********************************************** *     C++沒有要求顯式特化的接口必須和主模板的接口完全 *  匹配.如該例中,沒有定義主模板的empty函數,并且自行增加 *  了size和capitalize兩個函數. *     提醒:此例中不定義empty函數是不可取的,定義模板的 *  顯式特化和類的派生之間雖然不存在任何技術上的聯系,但 *  是用戶依然可以參考類的派生的優點,讓特化版本至少具有 *  主模板的基本能力.***********************************************/template<>//注意,無任何參數,當然,它本來就不是一個模板class Head<char *>{private:  std::vector<char *> h_;public:  void push(char *pval);  char * pop();  //注意,此處沒有提供empty函數喲!!!  size_t size() const;  void capitalize();};

2.模板局部特化
模板局部特化首先要聲明的是,C++還不支持對函數模板的局部特化,所以此處我們只討論類模板的局部特化.我們依然首先需要一個主模板.(參考類模板顯式特化) 自我理解:如果針對不能的指針定義不同的完全特化,豈不是太麻煩了,有沒有更好的辦法呢?那就是局部特化了.(例1)提示: 局部特化它是一個模板.完全特化不是一樣模板.

例1

/*********************************************** *  局部特化  *     和完全特化不同,這里的Heap參數類型只是被部分的確 *  定為T*,而T是一個未指定的類型,這就是為什么說它是局部 *  特化的原因; *     當使用一個未經任何修飾的指針類型來實例化Heap時, *  局部特化將優先于主模板; *     當使用const char * 或 char *(參考類模板顯式特化)來 *  實例化Heap時,此時完全特化又會優先于局部特化. *  Heap<std::string> h1;  主模板  T是std::string *  Heap<std::string *> h2;  局部特化  T是std:string *  Heap<int **> h3;    局部特化 T是int * *  Heap<char *> h4;  完全特化 T是char * *  Heap<const int *> h5;  局部特化 T是const int *  Heap<int (*)()> h6;  局部特化 T是int()***********************************************/template <typename T>class Heap<T *> //注意這里{private:  std::vector<T *>h_;public:  void push(const T *val);  T *pop();  bool empty()  {    return h_.empty();  }};template <typename T>void Heap<T *>::push(const T *val){  //......}

例2

/*********************************************** *     有一點很微妙但很有用:主模板的完全特化或局部特化 *  必須采用與主模板相同數量和類型的實參進行實例化,但它 *  的模板的參數并不需要具有和主模板相同的形式.***********************************************///定義一個模板,有三個模板參數,書寫形式如下template <typename R,typename A1,typename A2> //注意,局部特化中,模板參數也是三個,但書寫形式可不一樣嘍class Heap<R (*) (A1,A2)>{  //......};Heap<char *(*) (int,int)> h7; //R是char *,A1和A2是int//把 char *(*) (int,int) 想象成一個"指向有兩個參數的非成員函數的指針"template <class C,typename T>class Heap<T C::*>{  //......};Heap<std::string Name::*> h8;//T是string,C是Name

盡管為何需要對這些東西使用Heap只是一個猜測,先知道有這么一用法吧!

3.類模板成員特化

雖然模板的特化和類的派生之間沒有任何關系, 但在特化模板的時候,不妨借鑒一下派生的精神.也就意味著一個完全特化或局部特化通常必須重新實現 主模板具備的所有能力.
例:

//主模板template <typename T>class Heap{private:  std::vector<T> h_;public:  void push(const T& val);  T pop();  bool empty() const //const聲明在末尾表示該函數不能修改類變量  {    return h_.empty();  }}//其實我們真正需要特化的是 push 和 pop兩個函數.//對比顯式特化,它是通過主模板,再寫一個模板顯式特化版本類;//而這里只是對類模板成員進行了單獨特化.template<>void Heap<const char*>::push(const char *const &pval){  h_.push_back(pval);  std::push_heap(h_.begin(),h_.end(),strLess);}template<>const char* Heap<const char*>::pop(){  std:pop_heap(h_.begin(),h_end(),strLess);  const char* tmp = h_.back();  h_.pop_back();  return tmp;}


注意,這些函數的接口必須和 "它們正在特化其成員" 的模板的相應接口相匹配.如例1, 就得和主模板的接口相匹配.而如果你是自己再定義的一個顯式/局部特化版本類,就不需要匹配 一致.(見顯式特化和局部特化),最后指出兩點: 首先,除了成員函數外,其實成員也可以被顯式特化,如靜態成員和成員模板.其次,顯式特化是為模板或模板成員提供定制版本的一種手段;而顯式實例化僅僅是明確地告訴編譯器去實例化一個成員.       

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线观看| 97精品久久久| 57pao国产精品一区| 91在线视频导航| 欧美日韩国产一中文字不卡| 国产一区欧美二区三区| 国产精品一二三视频| 亚洲日本欧美日韩高观看| 在线性视频日韩欧美| 亚洲欧洲偷拍精品| 日韩av影视综合网| 色悠久久久久综合先锋影音下载| 亚洲free性xxxx护士白浆| 欧美一性一乱一交一视频| 国产97人人超碰caoprom| 日韩av成人在线观看| 久久久久久中文| 国产97在线|日韩| 亚洲欧美精品中文字幕在线| 日韩欧美在线视频日韩欧美在线视频| 欧美激情视频一区二区| 国产精品高潮在线| 久久国产加勒比精品无码| 亚洲福利视频网| 亚洲第一视频在线观看| 欧美一级片久久久久久久| 国产网站欧美日韩免费精品在线观看| 亚洲成色www8888| 国产精品久久久999| 国产精品视频一区国模私拍| 国产成人午夜视频网址| 97视频色精品| 亚洲日本欧美中文幕| 日韩av一区在线| 2019中文在线观看| 久久久精品2019中文字幕神马| 国产精品69精品一区二区三区| 成人黄色中文字幕| 中国人与牲禽动交精品| 欧洲永久精品大片ww免费漫画| 国产精品视频区| 欧美理论在线观看| 91亚洲国产精品| 成人午夜在线视频一区| 精品久久久久久亚洲精品| 色狠狠av一区二区三区香蕉蜜桃| 久久精品精品电影网| 精品视频久久久久久久| 91精品久久久久久久久久久久久久| 中文字幕在线亚洲| 亚洲深夜福利视频| 欧美高清不卡在线| 国产欧美一区二区三区久久| 亚洲一区二区免费| 国产www精品| 久久频这里精品99香蕉| 狠狠综合久久av一区二区小说| 久久视频在线观看免费| 一区三区二区视频| 久久精品国产亚洲| 在线观看日韩www视频免费| 亚洲综合av影视| 精品国产一区二区三区久久狼黑人| 丁香五六月婷婷久久激情| 国产一区欧美二区三区| 欧美一区二区三区免费观看| 亚洲人精品午夜在线观看| 国产午夜精品理论片a级探花| 欧美一级片久久久久久久| 亚洲激情在线观看视频免费| 精品国产区一区二区三区在线观看| 亚洲一区亚洲二区亚洲三区| 国产精品精品一区二区三区午夜版| 国产婷婷色综合av蜜臀av| 日韩精品视频三区| 91情侣偷在线精品国产| 一本大道亚洲视频| 国产日韩一区在线| 欧美日韩亚洲系列| 欧美激情亚洲国产| 亚洲精品99久久久久| 91精品久久久久久久久久久久久久| 国产精品视频1区| 97在线视频观看| 久久久久久美女| 成人性生交大片免费看小说| 欧美日韩亚洲激情| 青草成人免费视频| 久久韩剧网电视剧| 亚洲国产成人一区| 这里精品视频免费| 最近中文字幕2019免费| 欧美电影免费观看| 亚洲国产欧美自拍| 亚洲国产福利在线| 欧美日韩亚洲国产一区| 亚洲美腿欧美激情另类| 国产噜噜噜噜噜久久久久久久久| 日韩在线资源网| 91人成网站www| 国产成人精品电影| 国产亚洲精品久久久久动| 国产精品女人久久久久久| 欧美激情在线视频二区| 8x拔播拔播x8国产精品| 亚洲精品色婷婷福利天堂| 国产精品高清在线| 欧美精品久久一区二区| 国产精品一区二区久久| 青青草精品毛片| 国产成人精品亚洲精品| 日本在线观看天堂男亚洲| 国产亚洲精品综合一区91| 亚洲精品一区中文| 午夜精品www| 欧美日韩亚洲一区二区| 国产精品成人v| 日韩国产激情在线| 国产成人一区二区| 日韩免费在线观看视频| 国产精品爽黄69天堂a| 欧洲日韩成人av| 一本久久综合亚洲鲁鲁| 欧美性极品xxxx做受| 国产视频丨精品|在线观看| 亚洲男人第一av网站| 欧美大尺度激情区在线播放| 亚洲精品日产aⅴ| 国产日韩中文字幕在线| 久久精品久久精品亚洲人| 欧美激情中文字幕在线| 久久99热精品这里久久精品| 亚洲视频在线观看| 热久久美女精品天天吊色| 久久999免费视频| 日韩欧美亚洲范冰冰与中字| 国产精品久久久久久久美男| 日韩中文字幕在线视频播放| 国产在线视频91| 亚洲xxxx视频| 成人在线播放av| 海角国产乱辈乱精品视频| 欧美电影电视剧在线观看| 日韩欧中文字幕| 91久久久亚洲精品| 尤物tv国产一区| 久久久在线观看| 中文字幕在线看视频国产欧美| 亚洲久久久久久久久久久| 久久久久国产一区二区三区| 欧美在线视频在线播放完整版免费观看| zzijzzij亚洲日本成熟少妇| 日韩欧美a级成人黄色| 欧美日韩性视频在线| 在线成人激情视频| 久久久精品一区二区| 亚洲一区二区三区777| 日韩大陆毛片av| 两个人的视频www国产精品| 欧美午夜美女看片| 精品久久中文字幕久久av| 中文字幕不卡av| 欧美一区二区三区免费观看| 国产久一一精品|