1. 程式人生 > >類模板特例化

類模板特例化

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_t 
operator() (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命名空間

類模板特例化