Questions tagged «templates»

10
Java中的模板“元编程”是个好主意吗?
在一个相当大的项目中有一个源文件,它具有几个对性能极为敏感的功能(每秒被称为百万次)。实际上,先前的维护者决定编写一个函数的12个副本,每个副本的差别都很小,以节省在单个函数中检查条件的时间。 不幸的是,这意味着代码是要维护的PITA。我想删除所有重复的代码,只写一个模板。但是,Java语言不支持模板,我不确定泛型是否适合于此。 我目前的计划是写一个文件,该文件生成该函数的12个副本(实际上是一个只能使用的模板扩展器)。对于为什么必须以编程方式生成文件,我当然会提供很多解释。 我担心的是,这将导致将来的维护人员感到困惑,并且如果他们在修改文件后忘记重新生成文件,或者(如果更糟糕的话)他们以编程方式生成的文件进行修改,则可能会引入讨厌的错误。不幸的是,除了没有用C ++重写整个过程外,我看不到任何解决方法。 这种方法的好处是否大于缺点?我应该改为: 发挥性能优势,并使用单个可维护的功能。 添加有关为何必须重复执行该功能12次的说明,并应承担维护负担。 尝试将泛型用作模板(它们可能无法那样工作)。 大吼大叫的老维护者,使代码的性能取决于单个函数。 其他保持性能和可维护性的方法? PS:由于该项目的设计不佳,对功能进行性能分析非常棘手……但是,这位前维护人员说服了我,性能下降是不可接受的。我认为他的意思是超过5%,尽管这完全是我的猜测。 也许我应该详细说明一下。这12份副本执行的任务非常相似,但差别很小。在整个函数中的不同地方存在差异,因此不幸的是,有很多很多条件语句。有效地有6种“操作模式”和2种“范例”(由我自己编造的词)。要使用该功能,可以指定操作的“模式”和“范例”。这从来都不是动态的。每段代码仅使用一种模式和范例。所有12个模式范例对都在应用程序中的某个位置使用。这些函数恰当地命名为func1到func12,偶数代表第二个范例,奇数代表第一个范例。 我知道,如果以可维护性为目标,那将是最糟糕的设计。但是它似乎“足够快”,并且这段代码已经有一段时间不需要任何更改了。也值得注意的是原始功能尚未删除(尽管据我所知这是无效代码) ,因此重构将很简单。

3
为什么C ++模板错误消息如此恐怖?
C ++模板臭名昭著,因为它会生成冗长且无法读取的错误消息。我对C ++中的模板错误消息为何如此糟糕有一个大致的了解。本质上,问题在于直到编译器遇到模板中某种类型不支持的语法时才触发错误。例如: template <class T> void dosomething(T& x) { x += 5; } 如果T不支持该+=运算符,则编译器将生成一条错误消息。而且,如果这种情况发生在某处库的深处,则错误消息可能长达数千行。 但是C ++模板本质上只是一种编译时鸭子类型的机制。C ++模板错误从概念上讲非常类似于动态语言(例如Python)中可能发生的运行时类型错误。例如,考虑以下Python代码: def dosomething(x): x.foo() 在这里,如果x没有foo()方法,Python解释器将引发异常,并显示堆栈跟踪以及非常清楚的错误消息,指出问题所在。即使直到解释器深入某个库函数内部才触发错误,运行时错误消息也仍然不像典型的C ++编译器所发出的不可读呕吐那样糟糕。那么,为什么C ++编译器无法更清楚地指出出了什么问题?为什么某些C ++模板错误消息从字面上导致我的控制台窗口滚动5秒钟以上?

5
C ++模板只是一种美化的宏吗?
通过C ++模板和C#/ Java泛型之间的不同比较,例如: /programming/31693/what-are-the-differences-between-generics-in-c-and-java-and-templates-in-c/31929#31929 我感觉到,C ++模板是通过某种预处理(在解析之前替换纯文本)而不是通过编译实现的。因为C ++模板中的类型检查类似于C宏。我的意思是,如果存在一些错误,它们是处理模板代码块后生成的代码中的错误,而不是模板本身中的错误。换句话说,它们只是C语言中宏的一种上层版本。 然后我发现了其他一些事实支持这一点- 我认为,如果C ++模板通过预处理实现,则动态链接(使用.dll)会出现问题。快速搜索支持了这一点。 另一点是,整数常量可以作为参数传递给模板。而且它甚至支持某种递归。但是在编译的汇编/机器代码中找不到此递归。通过为每个递归调用生成函数,可以在编译时管理递归对象,因此具有更大但更快的可执行二进制文件。 尽管与C宏不同,但它具有一些优越的功能。但是C ++模板不是通过某种预处理实现的吗?如何在不同的C ++编译器中实现?
27 c++  c  compiler  templates  macros 

3
python业务逻辑应放在Django的确切位置
我刚刚开始学习Django / Python / Web开发。这个问题已经困扰我一段时间了。 我正在Django中创建带有多个模板的应用程序。我有一个views.py,它基本上只是呈现对相应模板的响应,并且我有一个我在其中构造数据库的model.py。在我的一个模板中,我需要上传一个图像(我能做到),并且我需要运行一个基于上传图像特性的逻辑(尚未完成)。这种逻辑涉及许多繁重的计算。执行计算后,逻辑应将一些已处理的信息(坐标)返回到模板。 我已经能够在一个独立的python桌面应用程序中成功地完成所有这些操作,一个又一个地调用python文件。但是,由于我现在想使它成为Web应用程序,所以我开始使用Django框架。 我已经做了很多搜索,但仍然无法弄清楚应将包含所有逻辑的Python文件放在哪里。我是否应该有另一个基于类的文件(logic.py),并从中调用它view.py?我在Google上搜索后发现,许多开发人员将其业务逻辑放在Django的models.py中。但是,我认为从直觉上来说是不正确的,因为模型应该专门与后端进行通信。任何帮助将不胜感激。

4
那么,LISP如何使宏系统的实现变得更容易呢?
我正在从SICP学习Scheme,给人的印象是,使Scheme以及LISP特别与众不同的很大一部分是宏系统。但是,由于宏是在编译时扩展的,所以人们为什么不为C / Python / Java /任何东西制作等效的宏系统?例如,可以将python命令绑定到expand-macros | python或任何其他内容。该代码对于不使用宏系统的人仍然可以移植,只是在发布代码之前扩展宏即可。但是除了C ++ / Haskell中的模板之外,我不知道其他类似的东西,我收集的模板并不完全相同。那么,LISP又如何使实现宏系统更容易呢?

8
如何在团队成员之间传播对通用编程的认识?
我住在一个人们相信的环境中: Java泛型是专门用于库编写而不是实际编码的功能。 C ++是一种OO编程语言;template是可选的和可避免的功能 但是,这些人高度依赖使用通用编程编写的库(例如STL,Java容器)。如果我使用templates或编写代码generics,则代码审阅者很可能会拒绝它,并会以“正确/可理解/优雅”的方式发表评论以编写代码。 这种心态适用于普通程序员到高级经理。没有出路,因为90%的时间里,这些人都有自己的游说手段。 解释它们的最佳方法是什么(不被割断),同时编写构成OO和通用编程的代码的实用方法是什么?
20 java  c++  templates  generics 

5
为什么C ++不能在其概念实现中采用D的方法?
众所周知,概念,C ++约束模板参数可能类型的方法未能包含在C ++ 11中。 我了解到D编程语言2.0的通用编程具有类似的功能。在我看来,其解决方案非常优雅和简单。 所以我的问题是,为什么C ++无法使用类似的方法。 C ++概念的目标可能大于D的实现所提供的目标? 还是C ++的传统使它无法采用这种方法? 还是其他? 感谢您的回答。 ps要查看D的通用编程能力的一些示例,请参阅:https : //stackoverflow.com/questions/7300298/metaprogramming-in-c-and-in-d/7303534#7303534
19 c++  templates  d 

5
如何使用纯PHP构建模板系统?
我正在阅读关于stackoverflow的这个问题: /programming/104516/calling-php-functions-within-heredoc-strings 并且接受的答案说要做像这样的纯PHP模板: template.php: <html> <头> <title> <?= $ title?> </ title> </ head> <身体> <?= getContent()?> </ body> </ html> index.php: <?php $ title ='演示标题'; 函数getContent(){ 返回'<p> Hello World!</ p>'; } include('template.php'); ?> 对我来说,以上内容在某种意义上来说并不是很好的结构,即template.php依赖于其他脚本中定义的变量。而且您在执行操作时使用include()执行代码include('template.php')(与使用include()包含未立即执行的类或函数相反)。 我觉得更好的方法是将模板包装在函数中: template.php: <?php 功能模板($ title,$ content){ ob_start(); ?> <html> <头> <title> <?= $ title?> </ …
15 php  templates 

2
如何避免在包装器中编写大量传递函数?
我有一个类,它包装了一个通用基本类型的另一个类。由于基本类型的接口很大,因此需要编写许多传递函数。我正在寻找避免这种情况的方法。 让我们举个例子: Car / \ Volvo VolvoWithTrailer 现在,我必须在VolvoWithTrailer的car接口中实现每个函数,并在包装​​好的Volvo对象上调用适当的函数,但GetMaxSpeed()可能会返回更低的值。基本上我将有很多功能,例如 int VolvoWithTrailer::GetNumSeats() { return mVolvo.GetNumSeats() } 解决此问题的一个明显方法是使VolvoWithTrailer成为Volvo的子类。 Car | Volvo | VolvoWithTrailer 但这似乎违反了主张组成优先于继承的原则。 我还要如何避免编写所有这些包装器(语言是C ++)?或者-如果那是您的职位-为什么我应该只写它们/只使用继承?有没有模板魔术可以帮助解决这个问题?

3
使用模板时,如何处理越来越长的编译时间?
我使用Visual Studio 2012,在某些情况下,我们将模板参数添加到“ just”类中​​以引入“接缝点”,以便在单元测试中可以将这些部分替换为模拟对象。 您通常如何在C ++中引入接缝点:使用接口和/或通过使用模板参数,还基于某些条件与隐式接口进行混合?提出此问题的原因之一还在于,当有时编译单个C ++文件(包括模板文件,还可能包括其他模板)时,会导致在开发人员机器上生成大约5-10秒的目标文件。 。 据我所知,由于模板包含模型,VS编译器在编译模板方面也不是特别快(实际上,您在每个间接使用它的文件中都包含了模板的定义,并且每次修改时都可能重新实例化该模板)与模板无关的内容)(在进行增量编译时),编译时间可能会出现问题。 使用模板时,处理增量(且不仅是)编译时间的方法是什么(除了更好/更快的编译器:-)外)。
13 c++  tdd  templates 

4
我应该在JSON响应中包含HTML标记吗?
在电子商务网站中,将商品添加到购物车时,我想显示一个弹出窗口,其中包含您可以选择的选项。假设您要订购iPod Shuffle,现在必须选择要雕刻的颜色和文字。 我希望窗口是模态的,所以我正在使用由Ajax调用填充的灯箱。现在我有两个选择: 选项1:仅发送数据,并使用JavaScript生成HTML标记 这样做的好处是,它将Ajax请求减少到了最低限度,并且没有将数据与标记混合在一起。 这样做的不好之处在于,现在我需要使用JavaScript进行渲染,而不是在服务器端使用模板引擎来进行渲染。通过使用客户端模板解决方案,我也许可以稍微清理一下方法。 选项2:发送HTML标记 这样做的好处是,我可以拥有与其余渲染任务(Django)相同的服务器端模板引擎,进行灯箱的渲染。JavaScript仅用于将HTML片段插入页面。因此,它显然将渲染留给了渲染引擎。我感觉合理。 但是由于某种原因,我不愿意在Ajax调用中混合数据和标记。我不确定是什么使我对此感到不安。我的意思是,每个网页的投放方式都一样-数据加标记-对吗?
13 mvc  django  templates  json 


1
“ C ++模板:完整指南”(c)2002 —是C ++ 11的最新版本?
《C ++模板:完整指南》(c)2002 这本书对我来说似乎很有吸引力,但是由于它已经12岁了,我担心它可能已经过时了。一年前,有一些非常受好评的Amazon评论,而C ++模板上没有其他最新的标题。有谁知道2002年出版的关于模板的书(而不是专门关于STL的书)是否具有被C ++ 11取代或添加的语法或概念? 以下是来自Amazon的书籍描述: 模板是C ++最强大的功能之一,但是它们常常被忽视,误解和滥用。C ++模板:《完整指南》使软件架构师和工程师清楚了解为什么,何时以及如何使用模板来更高效地构建和维护更清洁,更快,更智能的软件。 C ++模板从关于基础概念和语言功能的有见地的教程开始。本书的其余部分可作为全面参考,首先关注语言细节,然后关注多种编码技术,最后关注模板的高级应用程序。本书中使用的示例说明了抽象概念并演示了最佳实践。 读者学习 模板的确切行为 如何避免与模板相关的陷阱 从基本到以前未记录的成语和技术 如何在不威胁性能或安全的情况下重用源代码 如何提高C ++程序的效率 如何生产更灵活和可维护的软件
10 c++  templates 

4
C ++处理大型模板实现的首选方法
通常,在声明C ++类时,最佳实践是仅将声明放入头文件中,并将实现放入源文件中。但是,这种设计模型似乎不适用于模板类。 在网上查找时,对于管理模板类的最佳方法似乎有两种意见: 1.标头中的整个声明和实现。 这相当简单,但是我认为,当模板变大时,很难维护和编辑代码文件。 2.将实现写入末尾包含的模板包含文件(.tpp)中。 对我来说,这似乎是一个更好的解决方案,但似乎并未得到广泛应用。是否存在这种方法不及格的原因? 我知道很多时候,代码风格是由个人喜好或传统风格决定的。我正在开始一个新项目(将旧的C项目移植到C ++),并且我对OO设计比较陌生,并且希望从一开始就遵循最佳实践。

1
doxygen是否支持HTML输出模板?
我已经为记录了代码doxygen,但是我不希望它提供默认的HTML。我知道我可以通过提供自定义CSS,页眉,页脚等(如GNOME一样)以及如何向文件中添加通用PHP代码并将其保存为来对其进行自定义.php,但这并不是我真正想要的。 我想要的是像MSDN这样的输出。我真的无法形容。我的问题是,使用doxygen和模板之类的东西是否有可能,还是我必须输出XML并用另一个程序解析(我不介意编写)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.