《Effective C++》知识点(7)--模板与范型编程

41. 了解隐式接口和编译期多态

     41.1 面向对象编程的世界总是以显式接口和运行期多态(polymorphism)解决问题。   

     41.2 类和模板都支持接口和多态。

接口多态
类class显式的,基于函数签名通过虚函数发生于运行期
模板template隐式的,基于有效表达式通过template具体实现和函数重载解析发生于编译期
42. 了解typename的双重意义

     42.1 声明template参数时,<class T>和<typename T>的意义完全相同。 

     42.2 模板函数里的几种变量名称

变量名称英文定义
从属名称 dependent names依赖于某个template参数
嵌套从属名称nested dependent names从属名称在class内呈嵌套状
嵌套从属类型名称nested dependent type names嵌套从属名称并指向某种类型
非从属名称non-dependent names不依赖于任何template参数

             缺省情况下解析器认为嵌套从属名称不是个类型,除非你告诉它是(在前面放typename)

    42.3 "typename必须作为嵌套从属类型名称的前缀词"这一规则的例外是,typename不可以出现

            在base classes list内的嵌套从属类型名称之前,也不可在member initialization list中作为

            base class修饰符。 

    42.4 使用typedef定义嵌套从属类型名称(如果名字很长)的别名。

    42.5 typename在不同编译器上表现不同,可移植性差。 

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

    43.1 "template<>"表示模板全特化,这既不是template也不是标准class,而是个特化版的具体

            某个类的template。一旦类型参数被定义,再没有其它template参数可供变化。

    43.2 基类模板可能被特化,而特化版本可能不提供和一般性模板相同的接口。所以编译器拒绝

            在模板化基类内寻找继承而来的名称(函数)。 

    43.3 继承类模板内调用模板化基类函数的三个方法

        a. 在基类函数调用动作之前加上"this->"。

        b. 使用using声明式,在继承类了声明基类函数。

        c. 明白地指出被调用的函数位于基类内(不适合虚函数)。

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

     44.1 Templates生成多个类和多个函数,所以任何template代码都不该与某个造成膨胀的

             template参数产生相依关系。注意template代码中,重复是隐晦的。

     44.2 因非类型模板参数而造成的代码膨胀,往往可消除,做法是以函数参数或类成员变量替换

             template参数。

     44.3 因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述(比如指针

             类型)的具现类型共享实现码。

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

     45.1 请使用成员函数模板生成"可接受所有兼容类型"的函数。

     45.2 如果声明member templates用于"泛化copy构造"或"泛化assignment操作",你还是需要声

             明正常的copy构造函数和copy assignment操作符。

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

     46.1 在template实参推导过程中从不将隐式类型转换函数纳入考虑。

     46.2 template class内的friend声明式可以指涉某个特定函数。使用friend是目的是支持"所有参

             数的隐式类型转换"。

     46.3 为了让类型转换可能发生于所有实参身上,我们需要一个非成员函数;为了令这个函数被

             自动具现化,我们需要将它声明在class内部;而在class内部声明非成员函数的唯一办法

             就是令它为friend。这里使用friend与它的传统用途"访问class内非public成分"没有关系。  

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

     47.1 STL的5种迭代器分类

类型描述代表
Input只能向前,一次一步,只读且一次istream_iterators
Output只能向前,一次一步,只写且一次ostream_iterators
forward可读写一次以上(单向链表),继承自inputslist、tr1::hashed?
bidirectional可向前或向后移动,继承自forwardlist、set、map
random access可在常量时间内向前或向后跳跃任意距离,继承自bidirectionalvector、deque、string

    47.2 Traits

            Traits并不是C++关键字或一个预先定义好的组件;它们是一种技术,也是一个C++程序员

            共同遵守的协议。它对内置类型和用户自定义类型的表现必须一样好。习惯上,traits总是

             被实现为structs,但它们往往被称为traits classes。Traits classes使得"类型相关信息"在编

             译期可用,以模板和模板特化完成实现。整合重载技术后,traits classes有可能在编译期

             对类型执行if...else测试。

    47.3 设计并实现一个traits class

          a. 确认若干你希望将来可取得的类型相关信息。

          b. 为该信息选择一个名称。

          c. 提供一个template和一组特化版本,内含你希望支持的类型相关信息。

    47.4 如何使用一个traits class

          a. 建立一组重载函数(劳工函数)或函数模板,彼此间的差异只在各自的traits参数。令每个函

              数实现码与其接受之traits信息相对应。

          b. 建立一个控制函数(工头)或函数模板,它调用上述那些"劳工函数"并传递traits class所提供

              的信息。

48. 认识template元编程

       TMP(模板元编程),是编写基于模板的C++程序并执行于编译期的过程。

    48.1 TMP可将工作由运行期移到编译期,因而得以实现早期错误侦测和更高的执行效率(较小的

            可执行文件、较短的运行期、较少的内存需求),缺点是编译时间变长了。

    48.2 TMP可被用来生成"基于政策选择组合"的客户定制代码(如Strategy、Observer、Visitor),

             也可用来避免生成对某些特殊类型并不适合的代码。TMP里的循环是用递归完成的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/137154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Git】安装和常用命令的使用与讲解及项目搭建和团队开发的出现的问题并且给予解决

目录 Git的简介 介绍 Git的特点及概念 Git与SVN的区别 图解 ​编辑 命令使用 安装 使用前准备 搭建项目环境 ​编辑 团队开发 Git的简介 介绍 Git 是一种分布式版本控制系统&#xff0c;是由 Linux 之父 Linus Torvalds 于2005年创建的。Git 的设计目标是为了更好地管…

【LeetCode: 54. 螺旋矩阵 | 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

react 修改less文件后保存,内存溢出,项目崩溃问题解决

一、完整报错 一个很老的react项目&#xff0c;因为没有package-lock.json版本锁&#xff0c;导致拉下来的时候&#xff0c;安装的依赖版本冲突&#xff0c;好不容易启动起来&#xff0c;修改less文件后只要一保存&#xff0c;项目就会崩溃&#xff0c;需要重启&#xff0c;报…

【uni-app + uView】CountryCodePicker 国家区号组件

1. 效果图 2. 组件完整代码 <template><u-popup class="country-code-picker-container" v-if="show" :show

Django框架

目录 一.Django框架介绍 1.什么是Django框架 2.什么是web 3.web应用程序的优点 4.web应用程序的缺点 5.什么是web框架 二.wsgiref模块的使用 三.Django框架的学习 1.python中的主流框架&#xff1a; 2.如何使用Django &#xff08;1&#xff09;安装 &#xff08;2&a…

2013年108计网

第33题 在 OSI 参考模型中, 下列功能需由应用层的相邻层实现的是()A. 对话管理B. 数据格式转换C. 路由选择D. 可靠数据传输 很显然&#xff0c;题目所问的应用层的相邻层是表示层。该层实现与数据表示相关的功能。选项a中的对话管理属于会话层。选项c中的路由选择属于网络层。…

机器学习 - 决策树:技术全解与案例实战

目录 一、引言二、决策树基础决策树模型概述构建决策树的关键概念特征选择决策树的生成 决策树的剪枝 三、算法研究进阶提升树和随机森林提升树&#xff08;Boosted Trees&#xff09;随机森林&#xff08;Random Forests&#xff09; 进化算法与决策树决策树结构的进化 多目标…

吃啥大转盘

经常跟朋友出去吃饭&#xff0c;选择太困难了所以写了个简单的转盘&#xff0c;直接copy到txt文本然后把文件后缀改成html即可。 需要换食物直接在文件中找到 list 值按照格式替换一下即可。 效果&#xff1a; 代码块&#xff1a; <html><head><meta http-…

maven POM文件总体配置说明

<project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd "> <!-- 父项目的坐…

二十三种设计模式全面解析-组合模式与享元模式的结合应用:实现对象的共享和高效管理

在前文中&#xff0c;我们介绍了组合模式的基本原理和应用&#xff0c;以及它在构建对象结构中的价值和潜力。然而&#xff0c;组合模式的魅力远不止于此。在本文中&#xff0c;我们将继续探索组合模式的进阶应用&#xff0c;并展示它与其他设计模式的结合使用&#xff0c;以构…

【方法】如何取消PDF文件的“打开密码”?

我们知道&#xff0c;PDF文件可以设置“打开密码”&#xff0c;保护文件不被随意打开&#xff0c;那如果后续不需要了&#xff0c;要怎么取消“打开密码”呢&#xff1f;不清楚的小伙伴可以试试小编分享的3种方法&#xff01; 方法1&#xff1a;使用PDF编辑器 PDF编辑器不仅可…

技术分享 | Spring Boot 异常处理

Java 异常类 首先让我们简单了解或重新学习下 Java 的异常机制。 Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类&#xff0c;所有的异常类都是 Object 对象。 Error 是不可捕捉的异常&#xff0c;通俗的说就是由于 Java 内部 JVM 引起的不可预见的异常&#…

银行电子回单p图软件,建设农业邮政工商招商,易语言回执单快照截图

这次分享的还是通过易语言的画板自动绘画一个回执单的功能&#xff0c;套用的是网上一个回执单模版&#xff0c;我加了水印&#xff0c;防止被别有用心的人利用&#xff0c;然后一共我插入了5个图片资源&#xff0c;单选框选定后画板上面的图片会自动被替换为对应的图片模版&am…

星岛专栏|从Web3发展看金融与科技的融合之道

11月起&#xff0c;欧科云链与香港主流媒体星岛集团开设Web3.0安全技术专栏&#xff0c;该专栏主要面向香港从业者、交易机构、监管机构输出专业性的安全合规建议&#xff0c;旨在促进香港Web3.0行业向安全与合规发展。 出品&#xff5c;欧科云链研究院 自2016年首届香港金融…

配置 clangd 使用指定标准和编译器的规则

categories: Tips tags: C Tips 方法 下面内容均写入在项目根目录下的.clangd 文件中 指定C标准 CompileFlags:Add: [-stdc20]这个很简单, 但是后来我发现一个问题, 如果目录下存在 C 源文件, 那么就会提示错误, 没有这个编译选项, 那么下面还得添加个排除规则 排除规则 …

mysql基础 --函数

文章目录 内置函数自定义函数 内置函数 单行函数&#xff0c;单行输入&#xff0c;单行输出&#xff1b; # 数值函数 abs(-1), 绝对值 1 sign(-32), 负数取-1&#xff0c;正数取1 pi() 圆周率&#xff1b; ceil(x) 向上取整 floor(x) 向下取整 least(1,2,3) greatest(1,2,3…

降维·预测·救命:PCA、随机森林与乳腺癌

一、引言 乳腺癌作为女性健康领域的一大挑战&#xff0c;对全球范围内的女性健康产生了深远影响。据世界卫生组织&#xff08;WHO&#xff09;统计&#xff0c;乳腺癌已成为全球女性恶性肿瘤发病率的最高者&#xff0c;且呈现逐年上升的趋势。在中国&#xff0c;乳腺癌也是女性…

k8s存储卷 PV和PVC

目录 emptyDir存储卷 hostPath存储卷 nfs共享存储卷 PVC 和 PV 生命周期 一个PV从创建到销毁的具体流程如下&#xff1a; 静态pvc 动态pvc 3、定义PVC 4、测试访问 搭建 StorageClass NFS&#xff0c;实现 NFS 的动态 PV 创建 1、在stor01节点上安装nfs&#xff0…

电商大促演变:拼多多百亿补贴的消费升级体验

出品| 大力财经 文 | 魏力 拼多多已经够便宜了&#xff0c;双十一还能怎么玩&#xff1f;作为一个曾经被认为是深耕五环外消费者的电商平台&#xff0c;这几年拼多多从五环外杀到市中心&#xff0c;现在的国人&#xff0c;不管是中产&#xff0c;还是职场小白&#xff0c;人人…

混沌系统在图像加密中的应用(小波混沌神经网络)

混沌系统在图像加密中的应用&#xff08;小波混沌神经网络&#xff09; 前言一、小波混沌神经网络模型二、拓展三、python代码 前言 小波混沌神经网络是一种神经网络模型&#xff0c;结合了小波变换和混沌理论&#xff0c;用于信号处理、分类和预测。该模型基于多层前向神经网…