C++箴言:从模板中分离出参数无关的代码

 templates(模板)是节省时间和避免代码重复的极好方法。不必再输入20个相似的 classes,每一个包含 15 个 member functions(成员函数),你可以输入一个 class template(类模板),并让编译器实例化出你需要的 20 个 specific classes(特定类)和 300 个函数。(class template(类模板)的 member functions(成员函数)只有被使用时才会被隐式实例化,所以只有在每一个函数都被实际使用时,你才会得到全部 300 个member functions(成员函数)。)function templates(函数模板)也有相似的魅力。不必再写很多函数,你可以写一个 function templates(函数模板)并让编译器做其余的事。这不是很重要的技术吗?

是的,不错……有时。如果你不小心,使用 templates(模板)可能导致 code bloat(代码膨胀):重复的(或几乎重复的)的代码,数据,或两者都有的二进制码。结果会使源代码看上去紧凑而整洁,但是目标代码臃肿而松散。臃肿而松散很少会成为时尚,所以你需要了解如何避免这样的二进制扩张。

你的主要工具有一个有气势的名字 commonality and variability analysis(通用性与可变性分析),但是关于这个想法并没有什么有气势的东西。即使在你的职业生涯中从来没有使用过模板,你也应该从始至终做这样的分析。

当你写一个函数,而且你意识到这个函数的实现的某些部分和另一个函数的实现本质上是相同的,你会仅仅复制代码吗?当然不。你从这两个函数中分离出通用的代码,放到第三个函数中,并让那两个函数来调用这个新的函数。也就是说,你分析那两个函数以找出那些通用和变化的构件,你把通用的构件移入一个新的函数,并把变化的构件保留在原函数中。类似地,如果你写一个 class,而且你意识到这个 class 的某些构件和另一个 class 的构件是相同的,你不要复制那些通用构件。作为替代,你把通用构件移入一个新的 class 中,然后你使用 inheritance(继承)或 composition(复合)使得原来的 classes 可以访问这些通用特性。原来的 classes 中不同的构件——变化的构件——仍保留在它们原来的位置。

时间: 2024-08-03 17:08:28

C++箴言:从模板中分离出参数无关的代码的相关文章

Symfony实现行为和模板中取得request参数的方法_php实例

本文实例讲述了Symfony实现行为和模板中取得request参数的方法.分享给大家供大家参考,具体如下: 一.模板中取得参数 <?php echo $sf_request->getParameter('name','namespace');?> <?php echo $sf_request->getParameter('name');?> 二.行为中取得参数 $request->getParameter('name'); //模板中取得参数 <?php e

link环境下,制作一款《订餐软件》,请问从大库中分离出单店的小库,拆分怎么实现?

问题描述 link环境下,制作一款<订餐软件>,请问从大库中分离出单店的小库,拆分怎么实现? link环境下,制作一款<订餐软件>,请问从大库中分离出单店的小库,拆分怎么实现? 解决方案 用sql语句查询,得到数据,然后复制写于新的数据库里. 解决方案二: 给每个店子一个ID,根据此 ID 进行 SQL 查找即可. 解决方案三: 建议在出入库以及库存表中增加店铺的标识,这样通用sql就可以直接查询出任意店铺的数据

URL中去除指定参数实现C#代码_实用技巧

复制代码 代码如下: #region URL中去除指定参数 /// <summary> /// 中去除指定参数 /// </summary> /// <param name="url">地址</param> /// <param name="param">参数</param> /// <returns></returns> public static string bui

Javascript获取URL中的GET参数的例子

在前端开发中,我们经常需要根据页面之间传递的GET参数来用JS实现一些效果,这就涉及到一个方法:如何从当前页面的URL中分离出我们需要的GET参数. 包含GET参数的URL如下:index.php?a=11&b=abc&d=51,下面我来演示一下如果获取到GET参数. 1.获取到当前页面URL中的动态字符串 JS给了我们一个很好的方法:location.search,可以获取到当前页面URL中'?'后的字符串.  代码如下 复制代码 var str = location.search; 2

从字符串中分离文件路径、文件名及其扩展名

此函数从字符串中分离出路径 Function ParsePath (sPathIn As String) As String Dim I As Integer For I = Len(sPathIn) To 1 Step -1 If InStr(":\", Mid$(sPathIn, I, 1)) Then Exit For Next ParsePath = Left$(sPathIn, I) End Function 此函数从字符串中分离出文件名 Function ParseFile

《AngularJS实战》——3.1 模板中的过滤器

3.1 模板中的过滤器 过滤器的主要功能是格式化数据,这里所说的数据,既包括视图模板中的表达式,也包括控制器中的数组或对象.开发人员不仅可以方便地调用Angular中提供的过滤器,还可以自定义属于自己的过滤器.接下来,我们通过一些实用的案例,来介绍过滤器的强大功能. 3.1.1 排序方式过滤 在介绍排序(orderBy)过滤器之前,先来了解一下过滤器的使用格式.在Angular中,过滤器有3种调用方式,分别为单个过滤器.多个过滤器和带参数的过滤器,它们分别对应不同的使用格式,下面分别进行介绍.

web.py在模板中输出美元符号的方法_python

由于web.py已经在模板中定义"$"符号位定界符,所以在模板中如果要使用美元符号需要特殊处理. 如我要在模板中输出"$name"字符串: 复制代码 代码如下: $name 报错 $name被认定为一个变量而不是当作HTML字符串处理.如果想要输出"$name"字符串必须要这么写: 复制代码 代码如下: $$name 保存运行正确输出. 特别是跟jQuery里混合使用的时候,也要注意.如: 复制代码 代码如下: $("id")

函数模板 结构体数组-C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作?

问题描述 C++中带有数组参数的函数模板是否可以实例化为结构体数组类型来进行比较等操作? 不管什么类型的数组,都有一些类似的操作,因此可以使用函数模板实现代码复用.但是我在实现"查找"功能时不知道怎么处理结构体数组.要保证函数模板不仅适用于结构体数组,还适用于其他数组.求助各位大神! #include using namespace std; #define N 10 struct stu { int num; double score; }; /*查找:查找某元素,返回其下标*/ t

图片-在simulink中画出此图,但是始终没有波形,如何设置参数?

问题描述 在simulink中画出此图,但是始终没有波形,如何设置参数? 解决方案 > # ## __