C++Primer学习:模板特例化
来源:互联网 发布:steam数据扫号 编辑:程序博客网 时间:2024/05/16 08:57
(1)类模板特例化
某些时候通用模板的定义不适用,这个时候就需要对特定类型的实例进行特例化.
例子1:hash类模板是标准库里的一个模板,我们现在需要对它进行特例化,定义hash<Sales_data>
,使得关联容器可以存储相应的对象.
//注意,需要在sales_data上声明友元.#include "unordered_set"#include "Sales.h"namespace std{//打开名字空间 template<>//定义一个特例化的hash类 struct hash<Sales_data> { typedef size_t result_type; typedef Sales_data argument_type; size_t operator() (const Sales_data&) 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);//注意,hash<string>()生成一个不具名的对象,该对象调用() }}int main(int argc, char** argv){ unordered_multiset<Sales_data> record; Sales_data a("aaa", 10, 2), b("bbbb"), c("ccccc"); record.insert(a); record.insert(b); record.insert(c); for (auto it : record) print(cout, it)<<endl; return 0;}
(2)函数模板特例化:和类模板特例化相似,我有时候需要将函数模板特例化。下面通过一个例子来进行分析.
例子2:定义一个函数模板,统计一个给定值在vector中出现的次数。并且为该模板编写特例化版本来处理vector<const char *>
。
template<typename T>size_t compute(const vector<T>& vec, T key_value){ size_t count = 0; for (auto& it : vec) { if (it == key_value) ++count; } return count;}template<>size_t compute(const vector<const char*>& vec, const char* key_value){ size_t count = 0; for (auto &it : vec) if (strcmp(it,key_value)==0) ++count; return count;}//注意,在这里我们可以将给定值的类型定义为const T&,这在通用版本没有问题,但是在特例化的版本里面,如果我们传入字面字符串常量,就会出现问题,因为字符串常量被当作const char[],而形参是引用,所以实参不能够转换为指针.所以还是用T作为类型比较好.
例子3:对debug_rep进行特例化,处理const char*的字符指针.
template<>string debug_rep(const char* p){ std::string ret(p); return ret;}
0 0
- C++Primer学习:模板特例化
- C++primer阅读笔记-模板与泛型编程(模板特例化)
- C++学习之模板特例化
- C++模板特例化
- C++ 模板特例化
- C++模板,特例化
- 模板特例化
- 模板特例化
- C++模板特例化
- 学习C++模板---模板类带简单参数,并且添加缺省参数,特例模板
- 模板类特例化,模板函数特例化
- c++类模板特例化
- 模板特例化,偏特化
- C++primer学习:类模板(2)类模板:模板参数,成员模板和控制实例化
- C++模板,模板具体化,特例化
- C++primer学习:类模板(1):函数模板,模板参数,实例化
- C++primer学习:模板编程(4)
- 模板特例化的奇妙用法
- ios第一课 关于类的声明和实现
- postgresQL备份数据库shell
- 7、osg中响应键盘鼠标事件以及鼠标和键盘编码表
- Flume日志采集系统的安装和部署
- poj1611 The Suspects
- C++Primer学习:模板特例化
- 【docker】 windows 7 dockertoolbox 1.9 安装
- 无缝滚动原理与具体实现
- ostringstream的用法
- 查找最大元素
- mfc 直接操作ie浏览器自动填写表单实例
- Java中常用的集合类和Map详解
- 调用拷贝构造函数的时机
- 设置外键约束的SQL语句: