类模板特例化

参考来源:C++ primer 中文版第5版 P626。

1.举个例子:为标准库hash模板定义一个特例化版本,可以用它来将Sales_data对象保存在无序容器中。

默认情况下,无序容器使用hash来组织元素。

为了让我们自己的数据类型也能使用这种默认组织方式吗,必须定义hash模板的一个特例化模板。

一个特例化hash类必须定义:

(1) 一个重载的调用运算符,它接受一个容器关键字类型的对象,返回一个size_t。

(2)两个类型成员,result_type和argument_type,分别调用运算符的返回类型和参数类型。

(3)默认构造函数和拷贝赋值运算符。

  1. 我们可以向命名空间添加成员,首先,必须打开命名空间。
//打开命名空间,以便特例化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命名空间

原文链接: https://www.cnblogs.com/Shinered/p/9190590.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/276152

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午1:29
下一篇 2023年2月15日 上午1:29

相关推荐