《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/ ...
随机推荐
- win10操作系统下Android环境配置
Windows命令行调试unity(Android)应用环境变量配置准备步骤:先下载好我们需要的Android SDK和JDK. Android SDK推荐地址:http://tools.androi ...
- Python爬虫requests请求库
requests:pip install request 安装 实例: import requestsurl = 'http://www.baidu.com'response = requests. ...
- 某 .NET RabbitMQ SDK 有采集行为,你怎么看?
一:背景 1.讲故事 前几天有位朋友在微信上找到我,说他的一个程序上了生产之后,被运维监控定位到这个程序会向一个网址为: http://m.365ey.net 上不定期打数据,而且还是加密的格式,要他 ...
- JS 学习笔记(一)常用的字符串去重方法
要求:从输入框中输入一串字符,按回车后输出去重后的字符串 方法一: <body> <input type="text" id="input" ...
- C#通过unsafe来操作指针
这里不介绍unsafe的理论,这里单单介绍它的用法.如果要了解的更具体,可以看这篇大神的博文:C#通过指针操作图像 先从一个很简单的例子介绍: private void TestInptr() { u ...
- 开发用户K8S授权
#开发用户没有K8S权限 [ans@master ~]$ kubectl get po Unable to connect to the server: x509: certificate signe ...
- Centos7.6分区、格式化、自动挂载磁盘
个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 目录 1. 添加硬盘 2. 执行fdisk -l ...
- SQLi
点进去发现是个空白网页,查看源码发现一个login.php的文件,话不多说,直接选择复制然后访问 Url: http://5865f5830d034083b9bbc0dafc6b60a5d5d2309 ...
- 使用lamdba查询datatable中的一个值或者单元格
首先创建一个datatable,结构简单的分为两列 Datatable dt=new Datatable(); dt.Columns("code"); dt.Columns(&qu ...
- devexpress 中advBandedGridView内容自动换行和调整自适应行高
首先是自动换行,可以创建一个repositoryItemMemoEdit 并绑定到需要换行的列中 再设置一下repositoryItemMemoEdit高度自适应,这样子就完成了自动换行了 repos ...