C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译
Posted thefist11
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译相关的知识,希望对你有一定的参考价值。
1. 编写类型无关的代码
泛型代码的两个重要原则:
- 模板中的函数参数是const的引用。
- 函数体中的条件判断仅使用<比较运算。
大多数类型,包括内置类型和我们已经用过的标准库类型(除unique_ ptr和I0类型之外),都是允许拷贝的。但是,不允许拷贝的类类型也是存在的。通过将参数设定为const的引用,保证了这些类型可以用我们的compare函数来处理。
1.1 同时支持<运算符和>运算符
//期望的比较操作
if (v1 < v2) return -1;
if (v1 > v2) return 1;
return 0;
1.2 只支持< ,则是类型无关和可移植性
用less 来定义我们的函数:
//即使用于指针也正确的compare版本
template <typename T> int compare (const T &vl, const T &v2)
if (less<T>() (v1, v2)) return -1;
if (less<T>() (v2, v1)) return 1;
return 0;
2. 模板编译
为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义。因此,与非模板代码不同,模板的头文件通常既包括声明也包括定义。
模板包含两种名字:
-
那些不依赖于模板参数的名字
当使用模板时,所有不依赖于模板参数的名字都必须是可见的,这是由模板的提供者来保证的。而且,模板的提供者必须保证,当模板被实例化时,模板的定义,包括类模板的成员的定义,也必须是可见的。 -
那些依赖于模板参数的名字
用来实例化模板的所有函数、类型以及与类型关联的运算符的声明都必须是可见的,这是由模板的用户来保证的。
2.1 头文件
-
编写模板:必须提高头文件,包含模板定义以及在类模板或成员定义中用到的所有名字的声明。
-
调用模板:必须包含模板的头文件,以及用来实例化模板的任何类型的头文件。
2.2 模板代码假设
模板代码不针对特定类型,但通常对其所使用的类型有一些假设。
eg. compare模板假定实参类型定义了<运算符。
if (v1 < v2) return -1; //要求类型T的对象支持<操作.
if (v2 < v1) return 1; //要求类型T的对象支持<操作
用户调用时得符合假设,否则出错
Sales data datal, data2;
cout << compare (datal, data2) << endl; //错误: Sales_ data未定义<
以上是关于C++ Primer 5th笔记(chap 16 模板和泛型编程)类型无关和模板编译的主要内容,如果未能解决你的问题,请参考以下文章
C++ Primer 5th笔记(chap 16 模板和泛型编程)std::move
C++ Primer 5th笔记(chap 16 模板和泛型编程)模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)类模板特例化
C++ Primer 5th笔记(chap 16 模板和泛型编程)实例化