類模板特例化
阿新 • • 發佈:2018-06-16
pac esp ++ namespace result 運算 拷貝控制 name 拷貝
參考來源:C++ primer 中文版第5版 P626。
1.舉個例子:為標準庫hash模板定義一個特例化版本,可以用它來將Sales_data對象保存在無序容器中。
默認情況下,無序容器使用hash<key_type>來組織元素。
為了讓我們自己的數據類型也能使用這種默認組織方式嗎,必須定義hash模板的一個特例化模板。
一個特例化hash類必須定義:
(1) 一個重載的調用運算符,它接受一個容器關鍵字類型的對象,返回一個size_t。
(2)兩個類型成員,result_type和argument_type,分別調用運算符的返回類型和參數類型。
(3)默認構造函數和拷貝賦值運算符。
2. 我們可以向命名空間添加成員,首先,必須打開命名空間。
//打開命名空間,以便特例化std::hash namespace std { }
下面的代碼定義了能處理Sales_data 的特例化hash版本。
//打開std命名空間,以便特例化std::hash namespace std { template <> //定義一個特例化版本,模板參數為Sales_data struct hash<Sales_data> { //用來散列一個無序容器必須要定義以下類型 typedef size_t result_type; typedef Sales_data argument_type; size_toperator() (const Sales_data& s) const; //我們的類使用合成的拷貝控制成員 }; size_t hash<Sales_data> :: operator() (const Sales_data & s) const { return hash<string>() (s.bookNo) ^ hash<unsigned>(s.units_sold) ^ hash<double> (s.revenue); } } //關閉std命名空間
類模板特例化