青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天下

記錄修行的印記

C++ 高級主題之模板特化

C++ 高級主題之模板特化
我們很難寫出所有可能被實例化的類型都合適的模板。某些情況下,通用模板定義對于某個類型可能是完全錯誤的,所以我們需要能夠實現處理某些特殊情況,特化的概念變是如此。
compare函數和Queue類是這個問題的很好例子。因為與C風格字符串一起使用時,他們都不能正確工作。
template 
<typename T>
int compare(const T &v1,const T &v2)
{
    
if(v1 < v2) return -1;
    
if(v2 < v1) return 1;
    
return 0;
}
如果用兩個const 
char* 實參調用這個模板定義,函數將比較指針的值。也就是比較兩個指針在內存中的相對位置,卻并沒有說明與指針所指數組的內容有關的任何事情。
為了能夠將compare函數用于字符串,必須提供一個知道怎樣比較C風格字符串的特殊定義。這些就被稱作是特化的,它對模板的用戶而言是透明的。

1. 函數模板的特化
特化形式:
- 關鍵字template后面接一對空的尖括號<>;
- 再接模板名和一對尖括號<>,尖括號中指定這個特化定義的模板參數:
- 函數形參表
- 函數體
template
<>
int compare<const char*> (const char* const &v1,const char* const &v2)
{
    
return strcmp(v1,v2);
}
特化的聲明必須與 對應的模板相匹配。類型形參固定為const 
char*。
因此,函數形參是const 
char* 的const引用。當調用compare函數的時候,
傳給它兩個字符指針,編譯器將調用特化版本。而不調用上面的泛型版本。
const  char *cp1 = "world"*cp2 = "hi";
int i1, i2;
compare(cp1, cp2); 
//調用特化函數模板
compare(i1, i2);  //調用泛型函數模板
注意:
* 函數模板特化時template<>不能省略,如果缺少結果是聲明該函數的重載。
* 必須包含函數形參列表。如果可以從形參列表推斷模板實參,則不必顯示指定模板實參。
* 如果程序由多個文件構成,模板特化的聲明必須在使用該特化的每個文件中出現。

2.類模板的特化
當使用C風格字符串時,Queue類具有 compare函數相似的問題。問題就處在push函數中,該函數復制給定的值以創建Queue中的新元素。默認情況下,復制C風格字符串只會復制指針,不會復制字符。而顯然復制指針將出現一系列的嚴重問題。為了解決復制C風格字符串的問題,需要為const 
char*定義整個類的特化版本:
template
<> 
class Queue<const char*> 
{
public:
    
void push(const char*);
    
void pop() {real_queue.pop();}
    
bool empty() const {return real_queue.front();}
    
//返回類型與模板參數類型不同
    std::string front() {return real_queue.front();}
    
const std::string &front() const {return real_queue.front();}
private :
    Queue
<std::string> real_queue;
};

給Queue一個新的數據元素,string對象的Queue。在類的外部定義一個成員:
void Queue<const char*>::push (const char* val)
{
    
return real_queue.push(val);
}
這個函數通過調用read_queue的push函數把val指向的數組復制到未命名的string 對象中。當需要出隊列的時候調用相應real_queue.pop()函數即返回了這個string,從而解決了不用復制指針的問題。

3.特化成員而不特化類在上例的實現中,我們可以換一種方法,即不需要特化類,而只需要特化類的成員函數push、pop。根據函數模板特化的要求:
template 
<>
void Queue<const char*>::push(const char *const &val)
{
    
char * new_item = new char[strlen(val)+1];
    strncpy(new_item, val, strlen(val)
+1);
    QueueItem
<const char*> *pt = new QueueItem<const char*>(new_item);
        
    
if(empty())
        head 
= tail = pt;  //隊列中沒有元素
    eles{
        tail
->next = pt; //添加新元素到列尾
        tail = pt;
    }
}
template
<>
void Queue<const char*>::pop()
{
    QueueItem
<const char*> *= head;
    delete head
->item;  //刪除隊首元素
    head = head->next;  //指向當前隊首元素
    delete p;            //刪除零時指針
}

4.類模板的部分特化
    如果類模板有一個以上的模板形參,我們很有可能只要特化某些模板形參
    而不是全部形參。這時我們就需要使用類的部分特化。
//定義模板類
template <class T1, class T2>
class some_template{
    
// 
};

//定義模板類的部分特化:T2類型固定,部分特化T1類型
template<class T1>
class some_template<T1, int>{
    
// 
};
//使用類模板的部分特化
some_template<intstring> foo; //使用模板類
some_template<string,int> bar;  //使用模板類的部分特化
通過使用模板特化能解決一些在通?;蛘咄ㄓ们闆r下無法解決的特殊問題。在掌握了基本的語法規范和實現方法后便可以加以應用。

posted on 2013-06-26 11:36 天下 閱讀(1078) 評論(0)  編輯 收藏 引用 所屬分類: C/C++ 、C++模板

<2010年11月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

常用鏈接

留言簿(4)

隨筆分類(378)

隨筆檔案(329)

鏈接

最新隨筆

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品人人做人人爽 | 亚洲区一区二区三区| 国产精品入口尤物| 国产婷婷色综合av蜜臀av | 最新亚洲激情| 在线观看亚洲a| 91久久精品一区二区别| 一本一本久久a久久精品综合妖精| 亚洲精品在线视频观看| 亚洲午夜精品一区二区| 香蕉国产精品偷在线观看不卡| 久久高清国产| 亚洲第一页在线| 夜色激情一区二区| 欧美在线www| 玖玖玖国产精品| 欧美日韩国产黄| 国产视频在线观看一区二区| 亚洲大胆女人| 国产精品99久久久久久久vr| 久久久国产视频91| 亚洲人成在线免费观看| 欧美影院久久久| 欧美va亚洲va国产综合| 国产精品视频久久| 亚洲黄页视频免费观看| 午夜欧美大尺度福利影院在线看 | 国产精品一级| 亚洲黄网站黄| 久久精精品视频| 日韩天天综合| 免费日韩视频| 国产主播一区| 亚洲午夜一区| 亚洲丶国产丶欧美一区二区三区| 亚洲免费伊人电影在线观看av| 久久婷婷国产麻豆91天堂| 欧美网站在线观看| 亚洲欧洲久久| 免费观看久久久4p| 欧美一区二区私人影院日本| 欧美日精品一区视频| 在线免费观看日本一区| 久久国产精品高清| 亚洲午夜一级| 欧美三级在线| 亚洲图片欧洲图片av| 欧美成人一区二区| 久久久国产精品一区二区中文| 国产精品成人一区二区网站软件| 亚洲欧洲精品天堂一级| 亚洲精品社区| 久久激五月天综合精品| 一区二区不卡在线视频 午夜欧美不卡在 | 久久不射中文字幕| 一区二区三区精品国产| 欧美久久久久免费| 亚洲国产成人tv| 欧美/亚洲一区| 久久免费一区| 亚洲电影自拍| 欧美激情一区二区三区全黄 | 欧美午夜欧美| 亚洲一级在线| 亚洲一级黄色av| 国产精品久久久久久久久免费桃花| 日韩午夜激情电影| 亚洲精品乱码久久久久久久久| 女人色偷偷aa久久天堂| 亚洲人线精品午夜| 亚洲日本乱码在线观看| 欧美日韩精品三区| 欧美亚洲视频在线观看| 欧美一区三区二区在线观看| 国产欧美日韩综合精品二区| 久久成人综合视频| 久久人人精品| 夜夜嗨av色综合久久久综合网| 夜夜躁日日躁狠狠久久88av| 欧美三日本三级少妇三2023| 午夜在线视频一区二区区别| 久久精品亚洲一区二区三区浴池| 在线免费精品视频| 日韩视频在线免费观看| 国产精品视频观看| 免费久久久一本精品久久区| 欧美精品成人| 久久av二区| 欧美激情a∨在线视频播放| 亚洲天堂黄色| 久久成人精品| 亚洲视频日本| 久久久福利视频| 亚洲最快最全在线视频| 午夜免费在线观看精品视频| 最新国产の精品合集bt伙计| 亚洲午夜激情在线| 影音先锋日韩精品| 一区二区精品在线观看| 亚洲理伦在线| 欧美激情综合在线| 99在线精品免费视频九九视| 亚洲校园激情| 亚洲韩国青草视频| 新片速递亚洲合集欧美合集| 亚洲三级视频| 欧美在线日韩精品| 亚洲精品亚洲人成人网| 午夜视频久久久| 一区二区三区久久精品| 久久欧美中文字幕| 亚洲影院一区| 欧美大学生性色视频| 久久精品免费电影| 欧美视频久久| 亚洲欧洲三级| 在线成人激情| 欧美一区二区三区视频| 亚洲尤物影院| 欧美日韩在线视频一区| 亚洲国产婷婷综合在线精品| 在线免费不卡视频| 久久精品99| 久久蜜臀精品av| 国产农村妇女精品一二区| 中文网丁香综合网| 亚洲男同1069视频| 欧美日韩午夜视频在线观看| 亚洲第一狼人社区| 亚洲国产精品一区在线观看不卡| 久久精品一区四区| 老司机午夜精品视频在线观看| 国产欧美日韩专区发布| 亚洲一区二区高清| 亚洲欧美一区二区三区极速播放| 欧美日韩一区二区三区视频| 日韩视频免费观看| 亚洲永久免费av| 国产精品xxx在线观看www| aa级大片欧美| 欧美一级网站| 韩国福利一区| 老司机午夜精品视频| 欧美激情女人20p| 日韩午夜激情av| 欧美视频国产精品| 中文一区二区| 久久久久久久999精品视频| 韩国免费一区| 欧美成人免费一级人片100| 91久久精品美女| 亚洲在线一区| 国内揄拍国内精品少妇国语| 久久综合久久综合九色| 亚洲韩日在线| 性色av香蕉一区二区| 国内精品久久久久久影视8| 久久一本综合频道| 亚洲精品一区二区三| 亚洲专区欧美专区| 国产亚洲女人久久久久毛片| 老鸭窝毛片一区二区三区| 亚洲精品一二| 欲色影视综合吧| 欧美激情四色| 亚洲欧美国产高清| 欧美激情第8页| 午夜精品免费视频| 亚洲一级片在线看| 狂野欧美激情性xxxx| 国产亚洲欧美一区二区| 久久一日本道色综合久久| 亚洲日本精品国产第一区| 欧美一区二区三区久久精品茉莉花| 国产亚洲一区二区三区在线观看| 你懂的国产精品| 午夜视频一区| 亚洲日本黄色| 老鸭窝亚洲一区二区三区| 亚洲午夜羞羞片| 在线观看不卡av| 国产精品日产欧美久久久久| 乱中年女人伦av一区二区| 亚洲少妇中出一区| 亚洲国产精品ⅴa在线观看| 午夜伦理片一区| 日韩午夜黄色| 亚洲国产精品女人久久久| 国产亚洲激情在线| 欧美日韩中文字幕精品| 久久人人爽人人| 亚洲欧美激情一区二区| 亚洲精品一二三区| 欧美高清在线精品一区| 久久久一区二区| 欧美一区二区三区在线免费观看 | 国产亚洲欧美激情| 欧美日韩一区精品| 欧美国产极速在线| 久久久亚洲午夜电影|