类模板特例化

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

原文地址:https://www.cnblogs.com/Shinered/p/9190590.html

时间: 2024-10-11 04:18:18

类模板特例化的相关文章

模板特例化

template <typename T> class A{ private: T a; public: A(T x) :a(x){} void display() { cout << a << endl; } }; template<> class A<double> { private: double a; public: A(double x) :a(x){} void display() { cout << a <<

C++学习笔记36:类模板

类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typename T> class A; 类模板的成员 像普通类的成员一样定义 定义在类中或类外均可,后者需要在类名后列些模板参数,以区别非模板类的成员函数 template<typename T> T A<T>::f(u) 类成员函数的模板 成员函数可以使用其他模板 template<

C++学习之模板 ----函数模板、类模板

本博文主要讨论函数模板与类模板以及其简单应用. 1).作用:函数模板和类模板都可以看做是一种代码产生器,往里面放入具体的类型,得到具体化的函数或者class. 2).编译(分为两步): a):实例化之前,先检查模板本身语法是否正确: b):根据 函数调用或者类模板调用 ,先去实例化模板代码,产生具体的函数/类. 也就是说, 没有函数调用或者类类型对象声明,就不会实例化模板代码,在目标文件obj中找不到模板的痕迹. 3):优缺点 模板的缺点是代码膨胀,编译速度慢,而优点是运行速度快. 一.函数模板

C++STL - 类模板

类的成员变量,成员函数,成员类型,以及基类中如果包含参数化的类型,那么该类就是一个类模板 1.定义 template<typename 类型形参1, typename 类型形参2,...> class 类模板名[:基类]{ 成员变量 成员函数 成员类型 }; 2.使用 类模板名<类型实参1,类型实参2,...> 对象; 类模板名<类型实参1,类型实参2,...> &引用 = 对象; 类模板名<类型实参1,类型实参2,...> *指针 = &对

模版特例化(traits)

Traits偏特化:类模板部分特例化(partial specialization) 我们只能部分特例化类模板,而不能部分特例化函数模版.——<C++ Primer(5th)> P628 1. 实现 Sigma 函数,功能是将一段范围内的元素求累加和. 2. 错误的代码实例: template <typename T> T sigma(T* start, T* end) { T total = T(); while (start != end) total += *start++;

C++学习之模板 (二) -----类模板

由于将函数和类模板放在一块篇幅较大,我们今天将其拆分为两篇博文. 上篇博文我们讨论了函数模板的简单应用,本篇我们继续讨论模板的另一板块--类模板. 1).作用:类模板类似于代码产生器,根据用户输入的类型不同,产生不同的class: 2).编译: a):检查模板class 的自身语法: b):根据用户指定的类型 如 vector<string>,去实例化一个模板类. 注意: 不是实例化所以的代码,而仅仅实例化用户调用的部分: 类模板:简单实现如下; 1 #include <iostream

C++学习笔记50:队列类模板

队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h #ifndef QUEUE_H #define QUEUE_H #include <cassert> //类模板的定义 template <class T, int SIZE = 50> class Queue { private: int front, rear, count; T

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

c++类模板之间友元函数调用

1 #include <stdio.h> 2 #include <iostream> 3 4 using namespace std; 5 6 template<typename T> class BTree; 7 8 /***************************节点类模板*********************************/ 9 template<typename T> 10 class BTreeNode{ 11 friend