C++模板特例化應(yīng)用實例
模板特例化是C++程序設(shè)計中一個非常重要的應(yīng)用,本文就以實例形式對其進(jìn)行分析,相信對大家進(jìn)一步理解C++程序設(shè)計能夠帶來一定的幫助。具體內(nèi)容如下:
首先,模板是C++中一個很重要的特性,寫一份代碼能用于多種數(shù)據(jù)類型(包括用戶自定義類型)。例如,STL的sort()函數(shù)可以用于多種數(shù)據(jù)類型的排序,類stack可以用作多種數(shù)據(jù)類型的棧。但是,如果我們想對特定的數(shù)據(jù)類型執(zhí)行不同的代碼(而不是通用模板)呢?這種情況下就可以使用模板特例化(template specialization)。
一、函數(shù)模板特例化
當(dāng)特例化一個函數(shù)模板時,必須為原模板中的每個模板參數(shù)都提供實參。使用關(guān)鍵字template后跟一個空尖括號<>,即template <>,以指出我們正在特例化一個模板。
template <typename T>
void fun(T a)
{
cout << "The main template fun(): " << a << endl;
}
template <> // 對int型特例化
void fun(int a)
{
cout << "Specialized template for int type: " << a << endl;
}
int main()
{
fun<char>('a');
fun<int>(10);
fun<float>(9.15);
return 0;
}
輸出結(jié)果:
The main template fun(): a Specialized template for int type: 10 The main template fun(): 9.15
對于除int型外的其他數(shù)據(jù)類型,都會調(diào)用通用版本的函數(shù)模板fun(T a);對于int型,則會調(diào)用特例化版本的fun(int a)。注意,一個特例化版本的本質(zhì)是一個實例,而非函數(shù)的重載。因此,特例化不影響函數(shù)匹配。
二、類模板特例化
除了特例化函數(shù)模板,我們還可以特例化類模板。下面是一個簡單的例子:
template <typename T>
class Test{
public:
void print(){
cout << "General template object" << endl;
}
};
template<> // 對int型特例化
class Test<int>{
public:
void print(){
cout << "Specialized template object" << endl;
}
};
int main()
{
Test<int> a;
Test<char> b;
Test<float> c;
a.print();
b.print();
c.print();
return 0;
}
輸出結(jié)果:
Specialized template object General template object General template object
另外,與函數(shù)模板不同,類模板的特例化不必為所有模板參數(shù)提供實參。我們可以只指定一部分而非所有模板參數(shù),這種叫做類模板的偏特化 或部分特例化(partial specialization)。例如,C++標(biāo)準(zhǔn)庫中的類vector的定義:
template <typename T, typename Allocator>
class vector
{
/*......*/
};
// 部分特例化
template <typename Allocator>
class vector<bool, Allocator>
{
/*......*/
};
在vector這個例子中,一個參數(shù)被綁定到bool類型,而另一個參數(shù)仍未綁定需要由用戶指定。注意,一個類模板的部分特例化版本仍然是一個模板,因為使用它時用戶還必須為那些在特例化版本中未指定的模板參數(shù)提供實參。
上一篇:Linux網(wǎng)絡(luò)編程之UDP Socket程序示例
欄 目:C語言
下一篇:C++變位詞問題分析
本文標(biāo)題:C++模板特例化應(yīng)用實例
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3497.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10大數(shù)(高精度數(shù))模板(分享)
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改


