zoukankan      html  css  js  c++  java
  • 类模板特例化

    参考来源: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命名空间
    The Safest Way to Get what you Want is to Try and Deserve What you Want.
  • 相关阅读:
    CodeForces 55D Beautiful numbers(数位dp+数学)
    hdu 2089 不要62(数位dp入门)
    Git版本控制
    Git初始化-添加提交以及查看状态
    linux-高并发与负载均衡-lvs-3种模型推导
    Scrapy中选择器的用法
    Scrapy命令行详解
    Scrapy框架基本用法讲解
    MaxCompute教程
    Scrapy安装报错
  • 原文地址:https://www.cnblogs.com/Shinered/p/9190590.html
Copyright © 2011-2022 走看看