T.80: Do not naively templatize a class hierarchy

T.80:不要天真地模板化类继承

Reason(原因)

Templating a class hierarchy that has many functions, especially many virtual functions, can lead to code bloat.

模板化包含很多成员函数,特别是虚函数的类继承层次会导致代码膨胀。

Example, bad(反面示例)

template<typename T>
struct Container {         // an interfacevirtual T* get(int i);virtual T* first();virtual T* next();virtual void sort();
};template<typename T>
class Vector : public Container<T> {
public:// ...
};Vector<int> vi;
Vector<string> vs;

It is probably a bad idea to define a sort as a member function of a container, but it is not unheard of and it makes a good example of what not to do.

为容器定义一个排序成员函数几乎肯定就是一个坏主意,但这并非没有先例,可以当作说明我们不应该做什么的好例子。

Given this, the compiler cannot know if vector<int>::sort() is called, so it must generate code for it. Similar for vector<string>::sort(). Unless those two functions are called that's code bloat. Imagine what this would do to a class hierarchy with dozens of member functions and dozens of derived classes with many instantiations.

编辑器接受这段代码时,无法知道vector<int>::sort()是否被调用了,因此必须为之生成代码。vector<string>::sort()的情况也一样。只要这两个函数没有被调用,这就是一种代码膨胀。想象一下:这种情况如果发生在一个包含数十个成员函数和被多次例示的数十个派生类的继承结构时会发生什么。

Note(注意)

In many cases you can provide a stable interface by not parameterizing a base; see "stable base" and OO and GP

在很多情况下,你可以在不必参数化基类的情况下提供稳定的接口;参见“稳定的基类和OO and GP。

Enforcement(实施建议)

  • Flag virtual functions that depend on a template argument. ??? False positives

    标记依赖模板参数的虚函数。???假阳性。

原文链接

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#t80-do-not-naively-templatize-a-class-hierarchy

新书介绍

《实战Python设计模式》是作者最近出版的新书,拜托多多关注!

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。


觉得本文有帮助?请分享给更多人。

关注微信公众号【面向对象思考】轻松学习每一天!

面向对象开发,面向对象思考!

C++核心准则T.80:不要天真地模板化类继承相关推荐

  1. C++核心准则C.43:保证(值类型)可拷贝类有默认构造函数

    C.43: Ensure that a copyable (value type) class has a default constructor C.43:确保(值类型)可拷贝类有默认构造函数 Re ...

  2. C++核心准则​NR.4:不要坚持将每个类声明放在其自己的源文件中

    NR.4: Don't insist on placing each class declaration in its own source file NR.4:不要坚持将每个类声明放在其自己的源文件 ...

  3. php 语法 条件变量,C ++核心准则:注意条件变量的陷阱

    今天,我写了一篇关于条件变量的恐怖文章.您应该意识到条件变量的这一问题.C ++核心准则CP 42仅声明:"不要无条件等待". 等待!条件变量支持一个非常简单的概念.一个线程准备一 ...

  4. modbus软件开发实战指南_C++核心准则?GSL:指南支持库

    GSL: Guidelines support library GSL:指南支持库 The GSL is a small library of facilities designed to suppo ...

  5. 开源压缩算法brotli_Google的Brotli压缩算法,C ++核心准则以及更多新闻

    开源压缩算法brotli 在本周的开源新闻综述中,我们将介绍Google的Brotli压缩算法,适用于GitHub的Classroom,C ++ Core Guidelines等! 2015年9月20 ...

  6. C++初步之核心编程篇五:多态与虚函数类

    C++初步之核心编程篇五:多态与虚函数类 文章目录 C++初步之核心编程篇五:多态与虚函数类 1. 多态的概要 2. 多态案例一-计算器类 3. 纯虚函数和抽象类 4. 多态案例二-制作饮品 5. 虚 ...

  7. C++核心准则C.4:只有直接访问表达的函数,才应该成为成员

    C.4: Make a function a member only if it needs direct access to the representation of a class C.4:只有 ...

  8. C++核心准则ES.56​:只在需要将一个对象显式移动到另外的作用域时使用std::move​

    ES.56: Write std::move() only when you need to explicitly move an object to another scope ES.56:只在需要 ...

  9. C++核心准则边译边学-目标之外

    In.not: Non-aims(目标之外) The rules are not intended to be minimal or orthogonal. In particular, genera ...

最新文章

  1. c语言输入身高计算标准体重_女人身高165cm标准体重是多少?
  2. 测试用html文件是否存在,ASP如何检测某文件夹是否存在,不存在则自动创建
  3. java拷贝文件夹和删除文件夹
  4. java中一个分而治之的框架ForkJoin
  5. 入门到精通!珍藏资源!VAE变分自编码器
  6. python requests.get无法取出网页_Python requests获取网页常用方法解析
  7. 杭电 OJ 提交代码需要注意的问题
  8. 深入分析windows和Linux动态链接库的应用异同[转]
  9. C++ 动态连接库使用
  10. 晶振为什么不封装进芯片内部?
  11. TiDB DevCon2018.tick(1.20)
  12. Hadoop版本区别Hadoop组成
  13. 计算机cpu后面字母代表什么意思,CPU后缀含义是什么意思 AMD/intel处理器后缀字母代表什么涵义...
  14. 根据excel列动态创建mysql表,excel动态生成表格数据/EXCEL根据表2数据自动生成表1内容?...
  15. fastboot 命令
  16. 共轭梯度法确实存在数值精度的要求
  17. SQL 面试用题(重点)
  18. Bitly野心彰显,发布实时热门链接引擎Realtime
  19. zabbix 5.0中自定义监控单个IP的最大流量
  20. 【密码学】 一篇文章讲透数字证书

热门文章

  1. html chrome中引入外部字体,强制Chrome在CSS中使用外部字体
  2. 易优CMS月嫂家政服务公司网站模板源码+带后台
  3. 8K慢直播重构文旅新场景,向沉浸式时代迈进
  4. Cadence Allegro快捷键设置教程——随心应手,画图神速!秒变高手
  5. unix时间2038问题
  6. Freesurfer并行处理数据parallel
  7. 下载上市公司信息及公告原文到数据库
  8. python爬取物流信息_python爬取快递100,运行代码就能查询的物流信息
  9. aws 怎么将密钥转密码_将加密密钥存储在AWS Secrets Manager中
  10. 三分屏课件制作_不是所有的AMOLED手机屏都一样!实测华为P30用了怎样一块屏