C++模板特例化運用實例。本站提示廣大學習愛好者:(C++模板特例化運用實例)文章只能為提供參考,不一定能成為您想要的結果。以下是C++模板特例化運用實例正文
模板特例化是C++法式設計中一個異常主要的運用,本文就以實例情勢對其停止剖析,信任對年夜家進一步懂得C++法式設計可以或許帶來必定的贊助。詳細內容以下:
起首,模板是C++中一個很主要的特征,寫一份代碼能用於多種數據類型(包含用戶自界說類型)。例如,STL的sort()函數可以用於多種數據類型的排序,類stack可以用作多種數據類型的棧。然則,假如我們想對特定的數據類型履行分歧的代碼(而不是通用模板)呢?這類情形下便可以應用模板特例化(template specialization)。
1、函數模板特例化
當特例化一個函數模板時,必需為原模板中的每一個模板參數都供給實參。應用症結字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; }
輸入成果:
The main template fun(): a Specialized template for int type: 10 The main template fun(): 9.15
關於除int型外的其他數據類型,都邑挪用通用版本的函數模板fun(T a);關於int型,則會挪用特例化版本的fun(int a)。留意,一個特例化版本的實質是一個實例,而非函數的重載。是以,特例化不影響函數婚配。
2、類模板特例化
除特例化函數模板,我們還可以特例化類模板。上面是一個簡略的例子:
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; }
輸入成果:
Specialized template object General template object General template object
別的,與函數模板分歧,類模板的特例化不用為一切模板參數供給實參。我們可以只指定一部門而非一切模板參數,這類叫做類模板的偏特化 或部門特例化(partial specialization)。例如,C++尺度庫中的類vector的界說:
template <typename T, typename Allocator> class vector { /*......*/ }; // 部門特例化 template <typename Allocator> class vector<bool, Allocator> { /*......*/ };
在vector這個例子中,一個參數被綁定到bool類型,而另外一個參數仍未綁定須要由用戶指定。留意,一個類模板的部門特例化版本依然是一個模板,由於應用它時用戶還必需為那些在特例化版本中未指定的模板參數供給實參。