美文网首页
16模板与泛形编程

16模板与泛形编程

作者: 龟龟51 | 来源:发表于2017-10-26 11:17 被阅读0次

    16模板与泛形编程

    Oop能处理类型在程序运行之前都位置的情况;而在泛形编程中,在编译时就能获知类型了。

    16.1定义模板

    16.1.1函数模板

    模板参数列表中,每一个参数都要加上关键字typename或者class

    非类型模板参数

    表示一个值而非一个类型,必须是常量表达式,可以是一个整形或者是指向对象或函数类型的指针或(左值)引用。

    Inline和constexpr必须在模板参数列表之后,返回类型之前。

    模板编译

    当编译器遇到一个模板定义时,它并不生成代码。只有在实例化末班的一个特定版本是编译器才会生成代码。

    函数模板和类模板成员函数的定义通常放在头文件。

    大多数编译错误在实例化期间报告

    编译器在三个阶段报告错误

    (1)编译模板本身

    (2)编译器遇到模板使用时

    (3)模板实例化

    16.1.2类模板

    类模板的成员函数

    我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,类模板内定义的函数被隐式声明为内联函数。

    类模板成员函数的实例化

    一个类模板的成员函数只有当程序用到它是才进行实例化。

    在类代码内简化模板类名的使用

    在类模板自己的作用域中,可以直接使用模板名而且不提供实参。

    模板类型别名

    定义一个模板类型别名是,可以固定一个或多个模板参数。

    类模板的static成员

    相同类型的模板类只有一个相同名字static的值

    16.1.3模板参数

    一个模板参数名的可用范围是在其声明之后,至模板声明或定义结束之前、模板参数会隐藏外层作用域中声明的相同名字。模板内不能重用模板参数名,所以一个模板参数名在一个特定模板参数列表中只能出现一次。

    默认模板实参

    形参都有默认实参时,模板参数列表才能有默认实参。

    模板默认实参与类模板

    16.1.4成员模板

    一个类(无论是普通类还是类模板)可以包含本身是模板的成员函数。称为成员模板,不能为虚函数。

    类模板的成员模板

    16.1.5控制实例化

    显示实例化

    16.2模板实参推断

    从函数实参来确定模板实参的过程

    16.2.1类型转换与模板类型参数

    16.2.2函数模板显式实参

    必须顺序是对,才能推断出。

    如果显式的指定模板类型参数,就可以进行正常类型转换了。

    16.2.4函数指针和实参推断

    16.2.5模板实参推断和引用

    从左值引用函数参数推断类型

    模板类型参数一个普通(左值)引用只能传递给它一个左值(如一个变量或一个返回引用类型的表达式)

    引用折叠和右值引用参数

    编写接受右值引用参数的模板参数

    拷贝还是绑定一个引用?

    根据传入实参来确定是拷贝还是引用,传入左值是引用,右值则拷贝。

    右值引用通常用于模板转发或模板被重载。

    16.2.6理解std::move(不理解)

    从一个左值static_cast到一个右值引用是允许的

    16.2.7转发

    定义能保持类型信息的函数参数

    在调用中使用std::forward保持类型信息

    头文件utility中,forward返回该显式实参类型的右值引用,即,forward的返回类型是T&&。

    16.3重载与模板

    匹配规则:

    16.4可变参数模板

    可以通过sizeof知道包的大小。

    16.4.1编写可变参数函数模板

    16.4.2包扩展

    让扩展包中的元素作为单个元素供其他函数调用。

    16.4.3转发参数包

    使用forward来保持实参的原始类型

    16.5模板特例化

    一个特例化版本就是模板的一个独立定义,在其中一个或多个模板参数被指定为特定的类型。

    定义函数模板特例化

    一个特例化版本本质上是一个实例,而非函数名的一个重载版本。

    类似其他任何类,可以在类内或类外定义特例化版本的成员。

    ���������������%�+��"

    相关文章

      网友评论

          本文标题:16模板与泛形编程

          本文链接:https://www.haomeiwen.com/subject/tawhpxtx.html