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

天下

記錄修行的印記

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;  //使用模板類的部分特化
通過使用模板特化能解決一些在通常或者通用情況下無法解決的特殊問題。在掌握了基本的語法規范和實現方法后便可以加以應用。

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

<2013年6月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

常用鏈接

留言簿(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>
            亚洲一区免费| 亚洲一区欧美二区| 久久综合五月| 亚洲福利视频免费观看| 蜜桃久久精品乱码一区二区| 久久久久www| 亚洲国产精品第一区二区三区| 欧美激情一区二区三区高清视频 | 欧美成人官网二区| 巨胸喷奶水www久久久免费动漫| 亚洲激情电影在线| 亚洲精品国产系列| 欧美极品欧美精品欧美视频| 亚洲一区二区免费视频| 亚洲欧美国产高清| 亚洲第一精品影视| 亚洲三级免费电影| 国产乱人伦精品一区二区| 久久久久久夜| 欧美区亚洲区| 欧美一区二区三区日韩视频| 久久香蕉国产线看观看av| 日韩网站免费观看| 欧美中文在线免费| 一区二区三区色| 欧美影院成年免费版| 亚洲精品综合| 欧美一级专区| 亚洲午夜高清视频| 久久伊人一区二区| 先锋影音国产精品| 免费高清在线一区| 久久av红桃一区二区小说| 欧美国产第二页| 久久女同互慰一区二区三区| 欧美激情 亚洲a∨综合| 久久一二三四| 欧美视频在线观看 亚洲欧| 欧美成在线视频| 国产婷婷色一区二区三区四区| 亚洲国产精品va在线观看黑人| 国产区在线观看成人精品| 亚洲黄色在线看| 国产综合久久久久久| 亚洲亚洲精品三区日韩精品在线视频 | 久久er精品视频| 亚洲永久免费av| 欧美国产激情| 免费成人av在线| 国产亚洲日本欧美韩国| 一本久道久久综合狠狠爱| 亚洲欧洲日夜超级视频| 久久精品视频免费播放| 欧美制服第一页| 国产精品一区二区三区观看| 99视频+国产日韩欧美| 亚洲精品乱码久久久久| 麻豆成人在线播放| 免费黄网站欧美| 国产自产高清不卡| 午夜综合激情| 久久国产精品久久w女人spa| 国产精品进线69影院| 艳女tv在线观看国产一区| 在线一区日本视频| 欧美区一区二区三区| 亚洲欧洲一区二区在线观看| 亚洲精品国产精品久久清纯直播| 免费成人黄色片| 亚洲大片精品永久免费| 最新日韩中文字幕| 欧美国产日韩精品免费观看| 91久久精品www人人做人人爽| 亚洲国产美女久久久久| 免费久久99精品国产自| 欧美二区在线观看| 亚洲人成在线观看| 欧美精品三级日韩久久| 亚洲精品在线免费观看视频| 一区二区高清| 国产精品爱啪在线线免费观看| 亚洲午夜激情在线| 久久xxxx| 亚洲区免费影片| 欧美日韩xxxxx| 亚洲福利视频一区二区| 精品动漫3d一区二区三区| 久久久久久久一区二区| 欧美黄色成人网| av成人免费在线观看| 国产精品美女久久久| 久久久久久久一区二区| 91久久精品国产| 小黄鸭视频精品导航| 一区二区自拍| 欧美日韩ab片| 久久激五月天综合精品| 亚洲风情在线资源站| 亚洲一区二区四区| 国产亚洲精久久久久久| 欧美高清在线一区二区| 亚洲字幕一区二区| 欧美激情综合色| 亚洲在线日韩| 亚洲国产第一页| 国产精品毛片| 欧美jizz19性欧美| 亚洲一区二区在| 亚洲破处大片| 久久久亚洲高清| 亚洲一卡二卡三卡四卡五卡| 禁久久精品乱码| 欧美午夜视频一区二区| 久久精品网址| 亚洲永久免费av| 亚洲精品黄网在线观看| 蜜臀99久久精品久久久久久软件 | 亚洲精品视频一区| 国产日韩免费| 欧美日韩一区免费| 免费成人小视频| 久久国产精品第一页| 99热精品在线| 亚洲人成啪啪网站| 免费h精品视频在线播放| 香蕉尹人综合在线观看| 日韩午夜在线| 亚洲黄色av一区| 国产在线播放一区二区三区| 欧美午夜视频在线| 欧美激情中文不卡| 免费观看亚洲视频大全| 久久精品国产亚洲一区二区三区| 亚洲私人影院| 亚洲免费观看| 亚洲三级国产| 91久久精品一区二区别| 欧美成人一品| 欧美r片在线| 欧美成人a∨高清免费观看| 久久综合中文字幕| 老司机精品视频网站| 久久久亚洲一区| 久久人人爽人人| 久久综合狠狠| 欧美成人69av| 亚洲国产激情| 亚洲精品日韩精品| 亚洲免费观看| 亚洲天堂免费观看| 亚洲欧美国产日韩天堂区| 亚洲一区二区综合| 亚洲亚洲精品三区日韩精品在线视频| 一本在线高清不卡dvd| 一本色道婷婷久久欧美| 亚洲午夜视频在线观看| 亚洲自拍偷拍视频| 久久成人av少妇免费| 久久婷婷久久一区二区三区| 久久综合国产精品台湾中文娱乐网| 久久艳片www.17c.com| 欧美电影免费| 欧美日韩在线观看一区二区三区| 欧美日韩亚洲视频一区| 国产精品网红福利| 伊人狠狠色j香婷婷综合| 亚洲国产精品一区| 99re热这里只有精品免费视频| 亚洲网址在线| 久久三级福利| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产亚洲欧美一区在线观看 | 欧美日韩国产欧美日美国产精品| 欧美深夜福利| 国产亚洲欧美日韩一区二区| 亚洲国产精品嫩草影院| 亚洲综合电影| 久久亚洲精品一区二区| 最新国产拍偷乱拍精品| 亚洲午夜av在线| 久久综合五月天婷婷伊人| 欧美色大人视频| 在线观看国产日韩| 亚洲一区二区三区色| 蜜臀久久99精品久久久久久9| 亚洲欧洲在线播放| 欧美专区一区二区三区| 欧美日韩国产三区| 海角社区69精品视频| 一本色道久久综合亚洲精品不卡 | 国产精品99久久99久久久二8 | 亚洲视频精品| 久久综合狠狠| 一区二区三区视频在线观看| 久久久噜噜噜久久久| 欧美午夜一区二区| 亚洲欧洲一区二区三区在线观看| 欧美中文字幕视频在线观看| 亚洲国产日韩欧美在线图片| 欧美亚洲日本网站|