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

天下

記錄修行的印記

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

C++ 高級主題之模板特化
我們很難寫出所有可能被實例化的類型都合適的模板。某些情況下,通用模板定義對于某個類型可能是完全錯誤的,所以我們需要能夠?qū)崿F(xiàn)處理某些特殊情況,特化的概念變是如此。
compare函數(shù)和Queue類是這個問題的很好例子。因為與C風(fēng)格字符串一起使用時,他們都不能正確工作。
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* 實參調(diào)用這個模板定義,函數(shù)將比較指針的值。也就是比較兩個指針在內(nèi)存中的相對位置,卻并沒有說明與指針所指數(shù)組的內(nèi)容有關(guān)的任何事情。
為了能夠?qū)ompare函數(shù)用于字符串,必須提供一個知道怎樣比較C風(fēng)格字符串的特殊定義。這些就被稱作是特化的,它對模板的用戶而言是透明的。

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

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

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

3.特化成員而不特化類在上例的實現(xiàn)中,我們可以換一種方法,即不需要特化類,而只需要特化類的成員函數(shù)push、pop。根據(jù)函數(shù)模板特化的要求:
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;  //使用模板類的部分特化
通過使用模板特化能解決一些在通常或者通用情況下無法解決的特殊問題。在掌握了基本的語法規(guī)范和實現(xiàn)方法后便可以加以應(yīng)用。

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

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導(dǎo)航

統(tǒng)計

常用鏈接

留言簿(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>
            午夜精品999| 亚洲三级免费电影| 久久久久久久成人| 香蕉久久夜色精品国产使用方法| 夜夜爽99久久国产综合精品女不卡| 日韩午夜av电影| 一区二区三区不卡视频在线观看 | 久久久久久噜噜噜久久久精品| 欧美一区二区三区久久精品| 久久精品综合网| 欧美精品在线极品| 国产精品自拍在线| 在线精品国精品国产尤物884a| 亚洲激情综合| 香蕉久久夜色精品国产| 久久久久久久久一区二区| 蜜桃久久精品一区二区| 亚洲理论电影网| 欧美一区二区免费观在线| 麻豆精品精品国产自在97香蕉| 欧美日韩一区在线视频| 国产综合18久久久久久| 亚洲免费电影在线观看| 欧美在线黄色| 91久久夜色精品国产九色| 亚洲视频专区在线| 久久精品一区二区三区四区| 欧美日韩亚洲一区二区| 精品动漫一区| 欧美一区二区日韩一区二区| 亚洲丰满在线| 欧美自拍偷拍| 国产精品日韩欧美一区| 日韩一级二级三级| 欧美阿v一级看视频| 午夜精品久久久99热福利| 欧美金8天国| 在线观看亚洲精品视频| 欧美在线www| 亚洲最快最全在线视频| 欧美成人官网二区| 精品1区2区| 久久精品综合| 午夜精彩视频在线观看不卡 | 欧美日韩另类视频| 亚洲国产专区| 免费成人av在线| 性欧美暴力猛交69hd| 国产精品v欧美精品v日韩精品| 亚洲国产电影| 日韩午夜在线电影| 欧美日本乱大交xxxxx| 伊人久久亚洲热| 欧美一区二区在线播放| 中文一区二区在线观看| 欧美视频中文字幕在线| 亚洲精选一区二区| 亚洲第一二三四五区| 免费看的黄色欧美网站| 在线不卡中文字幕播放| 麻豆av一区二区三区| 久久精品国产一区二区三区免费看 | 国产欧美一区二区精品婷婷| 亚洲一区二区在| 在线亚洲欧美专区二区| 欧美日韩精品一本二本三本| 99视频在线观看一区三区| 亚洲精品视频在线| 国产精品久久999| 欧美一区二区三区婷婷月色 | 午夜亚洲福利| 韩日精品在线| 欧美黄色一级视频| 欧美精品尤物在线| 午夜一区二区三视频在线观看| 亚洲综合电影| 曰本成人黄色| 91久久精品国产91久久性色| 欧美视频一区在线| 欧美在线视频日韩| 麻豆精品在线视频| 日韩视频一区二区三区在线播放| 亚洲另类一区二区| 国产欧美日韩一区二区三区| 久久久久久伊人| 欧美99久久| 亚洲欧美日韩视频一区| 久久九九精品99国产精品| 亚洲乱码国产乱码精品精天堂| 99国产麻豆精品| 国产在线乱码一区二区三区| 亚洲第一色中文字幕| 国产精品久久一级| 另类尿喷潮videofree| 欧美精品亚洲精品| 久久久五月婷婷| 欧美日韩免费一区| 久久这里只有| 国产精品成人一区| 欧美成人综合一区| 国产精品久久毛片a| 欧美www视频| 国产欧美日韩亚洲一区二区三区 | 午夜激情综合网| 美女脱光内衣内裤视频久久网站| 亚洲欧美高清| 免播放器亚洲一区| 你懂的视频一区二区| 亚洲一区二三| 久久国产视频网| 激情久久五月| 亚洲精品一线二线三线无人区| 国产精品亚洲人在线观看| 麻豆久久婷婷| 欧美日韩国产一区二区| 卡一卡二国产精品| 国产伦精品一区二区三| 亚洲国语精品自产拍在线观看| 欧美日本一道本在线视频| 久久综合狠狠综合久久综合88| 欧美日韩免费视频| 亚洲成人在线视频网站| 国内精品免费在线观看| 亚洲男人的天堂在线| 亚洲私人影吧| 欧美激情精品久久久久久| 美日韩在线观看| 国产一区二区三区在线观看网站| 在线中文字幕日韩| 亚洲视频免费观看| 欧美日韩免费看| 99视频在线观看一区三区| 日韩视频在线免费观看| 欧美不卡高清| 亚洲激情av| 99视频国产精品免费观看| 牛牛精品成人免费视频| 欧美在线亚洲在线| 欧美久久成人| 欧美激情在线免费观看| 亚洲成色www8888| 久久久久久精| 久久在线精品| 一区在线播放| 美女黄网久久| 亚洲欧洲日产国产综合网| 亚洲精品国产日韩| 欧美成人在线网站| 亚洲精品美女久久久久| 亚洲调教视频在线观看| 国产精品免费一区二区三区在线观看| 在线亚洲免费视频| 久久精品夜色噜噜亚洲aⅴ| 在线观看一区欧美| 欧美高清视频www夜色资源网| 亚洲黄色有码视频| 欧美一区二区三区免费看| 国产欧美韩国高清| 欧美中文在线观看| 欧美韩日一区二区| av成人毛片| 国产曰批免费观看久久久| 久久五月婷婷丁香社区| 亚洲经典在线| 午夜久久电影网| 永久555www成人免费| 欧美精品久久久久久久久老牛影院 | 欧美一二三区在线观看| 韩国三级电影久久久久久| 欧美大片免费| 午夜精品久久久久| 亚洲激情电影在线| 欧美影视一区| 日韩视频永久免费| 国产视频久久| 欧美日本在线观看| 久久狠狠亚洲综合| 一区二区三区 在线观看视频| 麻豆精品传媒视频| 午夜精品久久久久久久久久久 | 韩日欧美一区二区| 欧美日韩一区二区免费视频| 久久国产欧美精品| 一区二区三区偷拍| 欧美激情亚洲一区| 久久激情视频免费观看| 一区二区三区**美女毛片| 黄色精品一区二区| 国产精品嫩草99a| 久久久久久穴| 亚洲激情欧美| 国产欧美日韩激情| 欧美精品一区二区三区在线播放 | 亚洲欧美制服中文字幕| 亚洲第一成人在线| 久久久夜精品| 久久国产精品久久久久久久久久| 一区二区三区四区五区在线| 亚洲黄色成人久久久| 激情综合视频|