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 模板和泛型编程)定义相关推荐

  1. C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化

    1. 问题 当两个或多个独立编译的源文件使用了相同的模板,并提供了相同的模板参数时, 每个文件中就都会有该模板的一个实例. 2. 解决方法 显式实例化 (explicit instantiation) ...

  2. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板实参

    1. 类型参数可以使用任何名字(通常命名为 T) template <typename Foo> Foo calc (const Foo& a, const Foo& b) ...

  3. C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译

    1. 编写类型无关的代码 泛型代码的两个重要原则: 模板中的函数参数是const的引用. 函数体中的条件判断仅使用<比较运算. 大多数类型,包括内置类型和我们已经用过的标准库类型(除unique ...

  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move

    1. 标准库定义 / / 在返回类型和类型转换中也要用到 typename, 参见 16.1.3 节( 第 593 页 ) reference 是在 16.2.3 节( 第 605 页 ) 中介绍的 ...

  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)效率与灵活性

    1. 标准库智能指针类型 shared_ptr 和 unique_ptr shared_ptr unique_ptr 管理所保存的指针的策略 共享指针所有权 独占指针 用户重载默认删除器的方式 在运行 ...

  6. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板部分特例化

    1. 类模板的部分特例化(partial specialization) 类模板的特例化不必为所有模板参数提供实参(可以只指定一部分而非所有模板参数, 或是参数的一部分而非全部特性).类模板的部分特例 ...

  7. C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化

    1. 定义一个特例化版本, 模板参数为 Sales data // 打开std 命名空间, 以便特例化 std::hash namespace std {template struct hash< ...

  8. C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化

    1. 场景 //第一个版本:可以比较任意两个类型 template <typename T> int compare (const T &, const T & );//第 ...

  9. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发参数包

    1. 使用可变参数模板与 forward 机制来编写函数, 实现将其实参不变地传递给其他函数(保持实参的原始类型) 1.1 eg class StrVec {public:template <c ...

  10. C++ Primer 5th笔记(chap 16 模板和泛型编程)包扩展

    1. 扩展 ( expand) 扩展一个包就是将它分解为构成的元素, 对每个元素应用模式, 获得扩展后的列表. 通过在模式右边放一个省略号(-)来触发扩展操作.当扩展一个包时,我们还要提供用于每个扩展 ...

最新文章

  1. C语言面向过程与C++面向对象
  2. Selenium3自动化测试——6.键盘操作
  3. 软件设计中的一些原则
  4. android 屏蔽home键操作
  5. 拥抱.NET Core系列:依赖注入(1)
  6. 网络基础2-2(传输层,端口,详谈UDP)
  7. 言图科技:GPU服务器选型
  8. 计算机软件应用员,济宁计算机办公应用软件操作员
  9. python format格式化输出填充符号不起作用_Python格式化输出——format用法示例
  10. linux 用dg分区,[bug报告] 兼容性问题,mbr硬盘使用分区扩容后linux系统不认分区...
  11. ubuntu配置spyder和jupyter notebook的工作目录
  12. 魅族MX4关闭系统升级Flyme6提示
  13. 冲动是魔鬼——4.25
  14. 《TCP IP 详解卷1:协议》阅读笔记 - 第十四章
  15. oracle数据库创建检查点,Oracle数据库通过检查点和RBA信息确定恢复范围
  16. Qmail加装自动杀毒(转)
  17. 苹果App Store应用程序的下载链接地址
  18. 【手把手带你刷LeetCode】——02.出现1次和K次的数(位运算)
  19. 自建家居 Wiki 系统(BookStack 服务)
  20. 感知器 - 西瓜好坏自动识别——python

热门文章

  1. 【Python】青少年蓝桥杯_每日一题_2.03_绘制菱形和圆
  2. Android --- View.inflate()的详细介绍
  3. 第十届蓝桥杯java B组—试题F 特别数的和
  4. 安川g7接线端子图_常用变频器接线端子集锦及接线示意图
  5. cmd写java程序_用cmd写一个最简单的Java程序
  6. spark 把一列数据合并_Spark Java-合并同一列多行 - java
  7. 机房空调制冷、加热、加湿、除湿这些功能如何应用?
  8. webbrowser 百度列表点击_前嗅ForeSpider采集教程:关键词的「检索列表」采集「检索结果」...
  9. AGI:走向通用人工智能的【哲学】之现实世界的虚拟与真实——带你回看1998年的经典影片《The Truman Show》感悟“什么是真实”
  10. NLP:GLUE和SuperGLUE基准的简介、任务分类、使用方法之详细攻略