《Effective C++》模版与泛型编程
Item41:了解隐式接口和编译期多态、
纵使你从未使用过templates,应该不陌生“运行期多态”和“编译期多态”之间的差异。因为它类似于“哪一个重载函数该被调用(发生在编译期)”和“哪一个virtual函数应该被绑定(发生在运行期)”之间的差异。
加诸于template参数身上的隐式接口,就像加诸于class对象身上的显式接口一样真实,而且两者都在编译期完成检查,就像你无法以一种“与class提供之显式接口矛盾”的方式来使用对象(代码将不会通过编译)。你也无法在template中使用“不支持template所要求之隐式接口”的对象(代码一样不能通过编译)。
Item42:了解typename的双重意义
template<typename C>
void print2d(const C&container)//打印容器内的第二个元素
{
if(container.size()>=2){
C::const_iterator iter(container.begin());
++iter;
int value=*iter;
std::cout<<value;
}
}
iter的类型是C::const_iterator,实际是什么必须取决于template参数C,template内出现的名字如果相依与某个template参数,称之为从属名称,如果从属名称在class内呈现嵌套状,我们称之为嵌套从属名称,C::const_iterator就是这样一个名称,实际上它还是个嵌套从属类型名称。
嵌套从属名称有可能导致解析困难,在我们知道C是什么之前,没有任何办法可以知道C::const_iterator是否为一个类型,而当编译期开始解析template print2d时尚未确定C是神恶魔东西,C++有个规则可以解析这一状态。
如果解析器在template中遭遇一个嵌套从属名称,它便假设这个名称不是个类型,除非你告诉它是(用typename)。
一般性规则很简单:任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在使用它的前一个位置上放上关键字typename。
有一个例外:“typename必须作为嵌套从属类型名称的前缀词”,这一规则的例外是,typename不可能出现在base classes list内的嵌套从属类型名称之前,也不可能在member initialization list(成员初始化列表)中作为base class的修饰符。
总结:①申明template参数时,前缀关键字clas和typename可以互换。
②请使用关键字typename来标志嵌套从属类型名称:但不能在base class lists(基类列表)或member initialization list内以它作为base class的修饰符。
Item44:将参数无关的代码抽离templates
总结:①template生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生依赖关系。
②因非类型模版参数而造成的代码膨胀,往往可以消除,做法是以函数参数或class成员变量替换template参数。
③因类型参数而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制长度的具现类型共享实现代码。
Item45:运用成员函数模版接受所有兼容类型
总结:请使用member function template(成员函数模版)生成“可接受所有兼容类型”的函数。
如果你声明member template用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符。
Item46:需要类型转换时要将模版定义为非成员函数
总结:当我们编写一个class template,而它所提供之“于此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template 内部的friend函数”。
Item47:请使用traits classes表现类型信息
这一小结可以参考我的另一篇总结。
《Effective C++》模版与泛型编程的更多相关文章
- Effective C++ —— 模板与泛型编程(七)
C++ templates的最初发展动机很直接:让我们得以建立“类型安全”的容器如vector,list和map.然而当愈多人用上templates,他们发现templates有能力完成愈多可能的变化 ...
- Effective C++ ——模板和泛型编程
条款41:了解隐式接口和编译器多态 以public继承的类,
- EffectiveC++ 第7章 模板与泛型编程
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 7 模版与泛型编程 Templates and Gen ...
- C++11 新特性总结
前言 转载请注明出处,感谢! C++11 的新特性 1 变量和基本类型 1.1 long long 类型 扩展精度浮点数,10位有效数字 1.2 列表初始化 初始化的几种不同形式,其中用花括号来初始化 ...
- c++进阶
对网络编程/多线程/系统编程有一定了解:4:对ngnix,redis,memcache有一定了解:5:有高并发服务开发经验优先: 因为C/C++在嵌入式.移动互联网.物联网有很大的优势,有很多人就靠一 ...
- EffectiveC++笔记 目录
Charpter 1. 让自己习惯C++ 条款01: 视C++为一个语言联邦 条款02: 尽量以const,enum,inline替换#define 条款03: 尽可能使用const 条款04: ...
- [转]C++ template —— 模板基础(一)
<C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...
- C++ template —— 模板基础(一)
<C++ Template>对Template各个方面进行了较为深度详细的解析,故而本系列博客按书本的各章顺序编排,并只作为简单的读书笔记,详细讲解请购买原版书籍(绝对物超所值).---- ...
- 《C++ Primer (V4)》读书笔记
第2章 变量和基本类型 1.(P56)如果使用class关键字来定义类,那么定义在第一个访问标号前的任何成员都隐式指定为private:如果使用struct关键字,那么这些成员都是public. 第7 ...
- 学习笔记之C++入门到精通(名师教学·手把手教会)【职坐标】_腾讯课堂
C++入门到精通(名师教学·手把手教会)[职坐标]_腾讯课堂 https://ke.qq.com/course/101465#term_id=100105503 https://github.com/ ...
随机推荐
- 齐博x1 二次开发的灵魂fun函数
X1最强大之处,体现在灵活,扩展性强,在使用过程中,你会发现灵活之处非常之多. 现在跟大家讲一下,灵魂函数 fun() X1的核心函数文件是 application/common.php 随着模块频道 ...
- python基础之if条件控制语句
前言 本文主要介绍控制流程中的if条件语句,包括if...:if...else...:if...elif...elif...else...:if...if...if...else...:if嵌套等.内 ...
- 知识图谱顶会论文(ACL-2022) CAKE:用于多视图KGC的可扩展常识感知框架
CAKE:用于多视图KGC的可扩展常识感知框架.pdf 论文地址:CAKE:Scalable Commonsense-Aware Framework For Multi-View Knowledge ...
- 盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
摘要:基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测.车距计算等基本功能,作为辅助驾驶入门级 ...
- CentOS6/7 配置守护进程
CentOS6.x CentOS6中转用Upstrat代替以前的init.d/rcX.d的线性启动方式. 一.相关命令 通过initctl help可以查看相关命令 [root@localhost ~ ...
- webpack优化项目
在使用vue 构建项目的时候 ,会用到vue.js, vue-router.js, 等库,通常打包的话会将这些公用的代码打包的一个文件中,导致该文件过大影响加载的速度.那么可以考虑使用cdn 加速的方 ...
- .NET7 gRPC JSON转码+OpenAPI
gRPC JSON转码 gRPC JSON 转码允许浏览器应用调用 gRPC 服务,就像它们是使用 JSON 的 RESTful API 一样. 浏览器应用不需要生成 gRPC 客户端或了解 gRPC ...
- 嵌入式-C语言基础:指针偏移打印数组
在C语言中,数组名代表数组中首元素的地址,所以,下面两句获取数组的首地址是等价的: #include<stdio.h> int main() { int a[5]={1,2,3,4,5}; ...
- 微信小程序的学习(二)
一.数据绑定 1.数据绑定的基本原则 在 data 中定义数据 在 wxml 中使用数据 2.如何在 data 里面定义数据? 在页面对应的 .js 文件中,把数据定义到 data 对象中即可: 3. ...
- 渗透技巧基于Swagger-UI的XSS
目录 免责声明: 漏洞简述: 漏洞实现 POC 漏洞利用 如何大规模找到 Swagger UI Google FOFA XRAY 修复 免责声明: 本文章仅供学习和研究使用,严禁使用该文章内容对互 ...