C++ Primer 5th笔记(chap 16 模板和泛型编程)定义
1. 函数模板
template <typename T> int compare (const T &v1,const T &v2)
{if (v1 < v2) return -1;if (v2 < v1) return 1;return 0;
}
编译器会实例化多个版本的模板实例
cout << compare(1, 0) << endl;// T为int,实例化出int compare (const int&, const int&)vector<int> vec1{1, 2,3}, vec2{4, 5,6};
cout << compare (vec1, vec2) << endl; // T为vector<int>,实例化出int compare (const vector<int>&, const vector<int>&)
1.1 类型参数type parameter
用typename或class标识,可以是函数的参数或函数的返回类型
eg.
//正确:返回类型和参数类型相同
template. <typename T> T foo(T* p)
{Ttmp=*p;//tmp的类型将是指针p指向的类型//.return tmp;
}
1.2 非类型模板参数nontype parameter
当一个模板被实例化时,非类型参数被一个用户提供的或编译器推断出的值所代替。这些值必须是常量表达式,从而允许编译器在编译时实例化模板。
eg.
template<unsigned N,unsigned M>
int compare (const char (&p1) [N],const char (&p2) [M])
{return strcmp(p1, p2) ;
}compare ("hi","mom" );->
编译器的版本:
int compare (const char (&p1) [3],const char(&p2) [4])
一个非类型参数表示一个值而不是类型
可以是一个整型、一个指向对象或函数类型的指针或(左值)引用。
绑定到非类型整型参数的实参必须是一个常量表达式。
绑定到指针或引用非类型参数的实参必须具有静态的生存期,不能用一个普通(非static)局部变量或动态对象作为指针或引用非类型模板参数的实参。
不能用一个普通(非static)局部变量或动态对象作为指针或引用非类型模板参数的实参。指针参数也可以用nullptr或一个值为0的常量表达式来实例化。
在模板定义内,模板非类型参数是一个常量值。在需要常量表达式的地方,可以使用非类型参数,eg. 指定数组大小。
1.2 inline和constexpr的函数模板
函数模板可以声明为inline或constexpr的,如同非模板函数一样。 inline 或constexpr说明符放在模板参数列表之后,返回类型之前:
//正确: inline说明符跟在模板参数列表之后
template <typename T> inline T min (const T&,const T&) ;//错误: inline说明符的位置不正确
inline template <typename T> T min(const T&,const T&) ;
C++ Primer 5th笔记(chap 16 模板和泛型编程)定义相关推荐
- C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化
1. 问题 当两个或多个独立编译的源文件使用了相同的模板,并提供了相同的模板参数时, 每个文件中就都会有该模板的一个实例. 2. 解决方法 显式实例化 (explicit instantiation) ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参
1. 类型参数可以使用任何名字(通常命名为 T) template <typename Foo> Foo calc (const Foo& a, const Foo& b) ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译
1. 编写类型无关的代码 泛型代码的两个重要原则: 模板中的函数参数是const的引用. 函数体中的条件判断仅使用<比较运算. 大多数类型,包括内置类型和我们已经用过的标准库类型(除unique ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
1. 标准库定义 / / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 ) reference 是在 16.2.3 节( 第 605 页 ) 中介绍的 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)效率与灵活性
1. 标准库智能指针类型 shared_ptr 和 unique_ptr shared_ptr unique_ptr 管理所保存的指针的策略 共享指针所有权 独占指针 用户重载默认删除器的方式 在运行 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化
1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
1. 定义一个特例化版本, 模板参数为 Sales data // 打开std 命名空间, 以便特例化 std::hash namespace std {template struct hash< ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包
1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型) 1.1 eg class StrVec {public:template <c ...
- C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展
1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...
最新文章
- C语言面向过程与C++面向对象
- Selenium3自动化测试——6.键盘操作
- 软件设计中的一些原则
- android 屏蔽home键操作
- 拥抱.NET Core系列:依赖注入(1)
- 网络基础2-2(传输层,端口,详谈UDP)
- 言图科技:GPU服务器选型
- 计算机软件应用员,济宁计算机办公应用软件操作员
- python format格式化输出填充符号不起作用_Python格式化输出——format用法示例
- linux 用dg分区,[bug报告] 兼容性问题,mbr硬盘使用分区扩容后linux系统不认分区...
- ubuntu配置spyder和jupyter notebook的工作目录
- 魅族MX4关闭系统升级Flyme6提示
- 冲动是魔鬼——4.25
- 《TCP IP 详解卷1:协议》阅读笔记 - 第十四章
- oracle数据库创建检查点,Oracle数据库通过检查点和RBA信息确定恢复范围
- Qmail加装自动杀毒(转)
- 苹果App Store应用程序的下载链接地址
- 【手把手带你刷LeetCode】——02.出现1次和K次的数(位运算)
- 自建家居 Wiki 系统(BookStack 服务)
- 感知器 - 西瓜好坏自动识别——python
热门文章
- 【Python】青少年蓝桥杯_每日一题_2.03_绘制菱形和圆
- Android --- View.inflate()的详细介绍
- 第十届蓝桥杯java B组—试题F 特别数的和
- 安川g7接线端子图_常用变频器接线端子集锦及接线示意图
- cmd写java程序_用cmd写一个最简单的Java程序
- spark 把一列数据合并_Spark Java-合并同一列多行 - java
- 机房空调制冷、加热、加湿、除湿这些功能如何应用?
- webbrowser 百度列表点击_前嗅ForeSpider采集教程:关键词的「检索列表」采集「检索结果」...
- AGI:走向通用人工智能的【哲学】之现实世界的虚拟与真实——带你回看1998年的经典影片《The Truman Show》感悟“什么是真实”
- NLP:GLUE和SuperGLUE基准的简介、任务分类、使用方法之详细攻略