上一篇Effective C++ -- 6 继承与面向对象设计

41、了解隐式接口和编译器多态

(1)class和template都支持接口和多态。Class支持显示接口,多态是指virtual引起的运行期多态;而template支持隐式接口和编译器多态。

(2)编译器多态是指以不同的template参数具现化function templates会导致调用不同的函数。隐式接口是指template中执行于类型对象身上的操作来决定的。

(3)显示接口由函数的签名式(函数名、参数类型、返回类型)构成,隐式接口不基于函数签名式,而是由有效表达式组成。

42、了解typename的双重含义

(1)声明template参数时,class和typename可互换。

(2)使用typename关键字标识嵌套从属类型名称。Template内体现的名称如果相依于某个template参数,称之为从属名称,如果从属名称在class内呈嵌套状,称之为嵌套从属名。但是不得在base class lists(基类列)或者member initialization list(成员初始列表)内以它作为base class修饰符。

43、学习处理模板化基类内的名称

(1)derived class template 往往拒绝调用base class template的函数,因为base class template有可能被特化,而那个特化版本可能不提供和一般性template相同的接口,因此它往往拒绝在templatized base class内寻找继承而来的名称。

(2)解决上述问题的方法:可在derived class template内通过“this->”指涉base class template内的成员名称,或籍由一个明白写出base class 资格修饰符完成(using声明式或用base::明确指出调用函数位于base class中)。

44、将与参数无关的代码抽离templates

(1)template 生成多个class和函数,所以任何template代码都不该与某个构成膨胀的template参数产生相依关系。

(2)因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者class成员变量代替template参数。

(3)因类型而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制表述的具现类型共享实现码。

45、运用成员函数模板接受所有兼容类型

(1)真实指针支持隐式转换,derived指针可以隐式转换为base指针,但是template不同,以带有base-derived的关系的两个类型分别具化某个template,产出来的两个具现体并不带有此种关系。

(2)使用member function templates(成员函数模板)生成“可接受所有兼容类型”的函数。

(3)如果声明member template用于泛化copy构造或泛化assignment操作,还需要声明正常的copy构造函数和copy assignment操作符。

46、需要类型转换时请为模板定义非成员函数

(1)template实参推导过程中从不将隐式类型转换函数纳入考虑,这样的转换在函数调用过程中确实被使用,但是能够调用一个函数之前,首先必须知道这个函数存在,为了知道它,必须先为相关的function template推导出参数类型,然后才能将适当的函数具现化出来。然而template实参推导过程中并不考虑采纳“通过构造函数而发生的”隐式类型转换。

(2)当编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,将那些函数定义为“class template内部的friend函数”。原因:为了让类型转换可能发生于所有实参身上,需要non-member函数;为了令函数被自动具现化,需要将它声明在class内部;在class内部声明non-member函数的唯一方法是令它成为friend。

47、请使用traits classes表现类型信息

(1)traits classes 使得“类型相关信息”在编译期可用,它们以template和template特化完成。不要将能在编译期进行的留到运行期,选择重载而不是判断语句。

(2)整合重载技术后,traits classes有可能在编译器对类型执行if…else测试。

48、认识template元编程

(1)template metaprogramming(TMP,模板元编程)是编写template-based C++程序并执行于编译器的过程。47的trait解法就是TMP。

(2)TMP可将工作由运行期移往编译器,因而得以实现早期错误侦测和更高的执行效率。TMP同时使程序有较小的可执行文件、较短的运行期、较少的内存需求。

(3)TMP可被用来生产“基于政策选择组合”的客户制定代码,也可用于避免生成对某些特殊类型并不适合的代码。

Effective C++ --7 模板与泛型编程相关推荐

  1. Effective C++ 学习笔记 第七章:模板与泛型编程

    第一章见 Effective C++ 学习笔记 第一章:让自己习惯 C++ 第二章见 Effective C++ 学习笔记 第二章:构造.析构.赋值运算 第三章见 Effective C++ 学习笔记 ...

  2. c++ swap函数头文件_C++函数模板(泛型编程)

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  3. C++ Primer 学习笔记_75_模板与泛型编程 --模板定义

    模板与泛型编程 --模板定义 引言: 所谓泛型程序就是以独立于不论什么特定类型的方式编写代码.使用泛型程序时,我们须要提供详细程序实例所操作的类型或值. 模板是泛型编程的基础.使用模板时能够无须了解模 ...

  4. c++ 函数模板_C++函数模板(泛型编程)

    模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码. 模板是创建泛型类或函数的蓝图或公式.库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念. 每个容器都有一个单 ...

  5. C++ 模板与泛型编程简述

    目录 1.什么是模板和泛型编程 2.定义及使用模板 1.什么是模板和泛型编程 什么是模板?什么是泛型编程?模板的概念与泛型编程是相辅相成的.想象一个场景:我们需要比较两个整数或两个字符串的大小,假如你 ...

  6. (十六)模板与泛型编程

    (十六)模板与泛型编程 1定义模板 1.1函数模板 1.2类模板 1.2.1定义 1.2.2实例化 1.2.3类模板与友元 1.2.4类模板类型别名 1.2.5类模板静态函数 1.3模板参数 1.4成 ...

  7. 【effective c++读书笔记】【第7章】模板和泛型编程(3)

    条款46:需要类型转换时请为模板定义非成员函数 对条款24的例子进行模板化: #include<iostream> using namespace std;template<type ...

  8. 《Effective C++》 总结篇(模板与泛型编程)

    条款四十一:了解隐式接口的和编译期多态 和面向对象编程的显示接口和运行期多态不同, 泛型编程更多是隐式接口和编译期多态. #include <iostream> using namespa ...

  9. 读书笔记--模板与泛型编程

    了解隐式接口和编译期多态 编译期多态和运行期多态 运行期多态就好比是virtual函数再运行的时候才确定该virtual函数该被绑定为哪个函数,运行的时候才确定函数类型. 编译期多态就好比是泛型编程和 ...

最新文章

  1. linux 常用find命令
  2. python【力扣LeetCode算法题库】35- 搜索插入位置
  3. linux文件物理结构,文件物理结构和存储空间管理
  4. Boost:简单移动平均线的测试程序
  5. extjs2.0 ie8 下拉树_ExtJs下拉树的实现
  6. cisc 和 risc_RISC和CISC | 电脑组织
  7. 第五章 线性回归 学习笔记下
  8. js中常见的数据加密与解密的方法
  9. (Tekla Structures二次开发)操作梁的属性对话框的宏语句
  10. your cuda software stack is old.we fall back to the NIVIDIA driver for some compilation. Update your
  11. 关于删除安装ESXI里的VIB小记。
  12. 发版流程及对外版本规范
  13. 电脑会不定时的突然黑屏加显卡风扇狂转,记录一次排查过程
  14. js日期计算,根据当前日期计算n个月后的日期
  15. 老宇哥带你玩转 ESP32:04 串口玩起来是真方便
  16. VBA之正则表达式(3)-- 特殊公式计算
  17. PDPS软件:导出AutoCAD可编辑的2D布局图
  18. 统计文章单词频数(C语言)
  19. 博文视点译者招募令!
  20. Element - 饿了么团队出品的神级桌面 UI 组件库

热门文章

  1. spark源码解析之基本概念
  2. mysql 压力测试之批量插入自增字段不连续问题
  3. Active Object 并发模式在 Java 中的应用--转载
  4. spring源码分析之spring-web web模块分析
  5. 当前工程读取配置文件示例
  6. myqltransactionRollbackexception deadlock found when trying to get lock
  7. 使用MySQL的LAST_INSERT_ID--转
  8. CSRF 攻击的应对之道--转
  9. 海象金服与沐金农签署战略合作协议,共谋消费金融发展 正文 财经网微评论(0人评论) 本文来源于东方网 2017-08-17 10:03:12 我要评论(0) share 快成为第一
  10. 机器学习-数据科学库(第三天)