《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/ ...
随机推荐
- Redis5种数据类型
字符串 @GetMapping("/string") public String stringTest(){ redisTemplate.opsForValue().set(&qu ...
- java中的栈(利用数组实现栈)
java中的栈(利用数组实现栈) 常见的数据结构:https://blog.csdn.net/weixin_43304253/article/details/119764275 栈的介绍 1.栈的英文 ...
- SpringBoot整合ES+Kibana
前言:最近在写一个HTTP代理服务器,记录日志使用的是ES,所以涉及到SpringBoot和ES的整合,整合完毕后又涉及到数据可视化分析,所以使用了Kibana进行管理,有些坑,需要记录一下 Spri ...
- rabbitmq原理和应用
0.1.索引 https://blog.waterflow.link/articles/1663772504649 RabbitMQ 是一个轻量级且易于部署的消息队列.它支持开箱即用的多种消息传递协议 ...
- 10.pygame-碰撞检测
添加并监听英雄发射子弹事件 class Hero(GameSprite): def __init__(self): # 调用父类方法,设置image super().__init__('./image ...
- 6.pygame-搭建主程序
职责明确 新建plane_main.py 封装主游戏类 创建游戏对象 启动游戏 新建plane_sprites.py 封装游戏中所有需要使用的精灵子类 提供游戏的相关工具 #plane_sprit ...
- 8.-Django应用及分布式路由
一.应用 应用在Django项目中是一个独立的业务模块,可以包含自己的路由.视图.模版.模型,可以看成一个小的mtv 创建步骤 1.项目下用manage.py中的子命令创建应用文件夹 python3 ...
- CentOS下一些软件的安装
Git # 参数 -y 表示yes,不用询问直接安装 yum -y install git # 第一次安装需要一些配置 git config --global user.name "Your ...
- 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用
使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...
- i春秋phone number
点开题目是一个普普通通的登录注册界面,随便注册一个点进去有两个功能,一个是查看电话和你相同的用户,一个是登出. 点击查询就可以看到用户数 这里有访问数据库的操作应该,所以就应该用数据库注入来解题. 又 ...