我一直在和朋友聊天,有些人完全同意应该使用C++中的模板,其他人完全不同意.
一些好事是:
它们使用起来更安全(类型安全).
它们是对API进行一般化的好方法.
关于C++模板,您能告诉我哪些其他好处?
你能告诉我有关C++模板的哪些不好的事情?
编辑:我问这个的原因之一是我正在攻读考试,目前我正在讨论C++模板的主题.所以我想更多地了解它们.
模板是一种非常强大的机制,可以简化许多事情.然而,正确使用它们需要很多时间和经验 - 以确定何时使用它们是合适的.
对我来说,最重要的优势是:
减少代码的重复(通用容器,算法)
减少高级代码的重复(MPL和Fusion)
静态多态(= performance)和其他编译时计算
基于策略的设计(灵活性,可重用性,更容易更改等)
免费提高安全性(即通过Boost装置进行尺寸分析,静态断言,概念检查)
函数式编程(Phoenix),懒惰评估,表达式模板(我们可以在C++中创建特定于域的嵌入式语言,我们有很棒的Proto库,我们有Blitz ++)
日常生活中使用的其他不那么引人注目的工具和技巧:
STL和算法(for
和之间有什么区别for_each
)
bind,lambda(或Phoenix)(编写更清晰的代码,简化事情)
提升功能(使写回调变得更容易)
元组(如何通用散列元组?以Fusion为例......)
TBB(parallel_for
和其他类似STL的算法和容器)
你能想象没有模板的C++吗?是的,我可以在早期因为编译器限制而无法使用它们.
你会在没有模板的情况下用C++编写吗?不,因为我会失去上面提到的许多优点.
缺点:
编译时间(例如扔Sprit,Phoenix,MPL和一些Fusion,你可以去喝杯咖啡)
人们谁可以使用和理解模板并不常见(和这些人都是有用的)
人们谁认为他们可以使用和理解模板是很常见(和这些人都是危险的,因为它们可以使地狱的代码.但大部分的一些教育/指导后,将加入在之前的点中提到的组)
模板export
支持(缺乏)
错误信息可能不那么神秘(经过一些学习,你可以找到你需要的东西,但仍然......)
我强烈推荐以下书籍:
C++模板:David Vandevoorde和Nicolai Josuttis的完整指南(对模板主题的全面介绍)
现代C++设计.通用编程和设计模式由Andrei Alexandrescu应用(使用模板简化代码,使开发更容易并使代码对变更具有鲁棒性的不太知名的方法是什么)
由David Abrahms和Aleksey Gutov编写的C++模板元编程(再次 - 使用模板的不同方式)
来自Wikibooks的更多C++成语提出了一些不错的想法.
从积极的方面来说,C++模板:
允许类型的泛化
减少需要键入的冗余代码量
帮助构建类型安全的代码
在编译时进行评估
可以提高性能(作为多态性的替代)
帮助构建非常强大的库
在消极方面:
如果不小心,可能会很快变得复杂
大多数编译器都会提供神秘的错误消息
使用/调试高度模板化的代码可能很困难
至少有一个句法怪癖(>>运算符可以干扰模板)
帮助使C++很难解析
总而言之,应该仔细考虑何时使用模板.
我的2c相当消极。
从来没有将C ++类型设计为执行编译时间计算。使用类型来实现计算目标的概念非常明显,这是一个hack –而且,从未有人寻求过,但是偶然发现了
..
在您的代码中使用MP的回报是解决了一个难题之后的满足感。你做的东西,在100线否则将采取200您研磨通过自己的方式难以理解的错误消息去的地步,如果一个点你需要的代码扩展到一个新的情况下,你会知道确切的三线模板功能超载。您的维护者当然必须无限地投入更多资金才能实现同样的目标。