类模板特例化

参考来源: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命名空间

 

posted @ 2018-06-16 15:10  卷积  阅读(786)  评论(0编辑  收藏  举报