C ++模板有哪些优点和缺点?

时间:2009-03-07 22:46:34

标签: c++ templates

我一直在与朋友交谈,有些人完全同意应该使用C ++中的模板,其他人完全不同意。

一些好事是:

  • 使用起来更安全(类型安全)。
  • 它们是对API进行概括的好方法。

关于C ++模板,您能告诉我哪些其他好处?

你能告诉我有关C ++模板的哪些不好的事情?

编辑:我问这个的原因之一是我正在攻读考试,目前我正在讨论C ++模板的主题。所以我想更多地了解它们。

10 个答案:

答案 0 :(得分:45)

模板是一种非常强大的机制,可以简化许多事情。然而,正确使用它们需要很多时间和经验 - 以确定何时使用它们。

对我而言,最重要的优势是:

  • 减少代码的重复(通用容器,算法)
  • 减少高级代码的重复(MPL和Fusion)
  • 静态多态(=性能)和其他编译时计算
  • 基于策略的设计(灵活性,可重用性,更容易更改等)
  • 免费提高安全性(即通过Boost装置进行尺寸分析,静态断言,概念检查)
  • 函数式编程(Phoenix),懒惰评估,表达式模板(我们可以在C ++中创建特定于域的嵌入式语言,我们有很棒的Proto库,我们有Blitz ++)
  • 日常生活中使用的其他不那么引人注目的工具和技巧:
    • STL和算法(forfor_each之间有什么区别)
    • bind,lambda(或Phoenix)(写清楚代码,简化事情)
    • 提升功能(使写回调更容易)
    • 元组(如何通用散列元组?例如使用Fusion ......)
    • TBB(parallel_for和其他类似STL的算法和容器)
  • 你能想象没有模板的C ++吗?是的,我可以在早期因为编译器限制而无法使用它们。
  • 你会在没有模板的情况下用C ++编写吗?不,因为我会失去上面提到的许多优点。

缺点:

  • 编译时间(例如扔Sprit,Phoenix,MPL和一些Fusion,你可以去喝杯咖啡)
  • 能够使用和理解模板的人并不常见(这些人很有用)
  • 那些认为他们可以使用和理解模板的人很常见(这些人很危险,因为他们可以从你的代码中解脱出来。但是大部分人都经过一些教育/指导将加入上一点提到的小组)
  • 模板export支持(缺少)
  • 错误消息可能不那么神秘(经过一些学习,你可以找到你需要的东西,但仍然......)

我强烈推荐以下书籍:

答案 1 :(得分:13)

从积极的方面来说,C ++模板:

  • 允许进行类型

  • 的概括
  • 减少键入

  • 所需的冗余代码量
  • 帮助构建类型安全的代码

  • 在编译时评估

  • 可以提高性能(作为多态性的替代方案)

  • 帮助构建非常强大的库

否定的一面:

  • 如果不小心,可能会很快变得复杂

  • 大多数编译器都会提供隐含的错误消息

  • 使用/调试高度模板化的代码

  • 可能很困难
  • 至少有一个句法怪癖(>>运算符可能会干扰模板)

  • 帮助使C ++很难解析

总而言之,应该仔细考虑何时使用模板。

答案 2 :(得分:4)

好点:强大;允许您:

  • 规定编译时属性和计算
  • 描述通用算法和数据结构
  • 做许多其他本来会重复,无聊和容易出错的事情
  • 用语言表达,没有宏(可能更危险,更模糊!)

坏点:强大;允许您:

  • 引发冗长,误导和模糊的编译时错误(尽管不像宏那样模糊和误导......)
  • 制造模糊和危险的错误设计(虽然不像宏那样容易......)
  • 如果你不小心(就像宏!)
  • 会导致代码膨胀

模板极大地增加了可行的设计空间,这不一定是坏事,但它确实使它们更难以使用。模板代码需要维护人员不仅要了解语言功能,还要了解语言功能的设计后果;实际上,这意味着许多开发人员团队除了C ++模板中最简单,最制度化的应用程序之外的所有应用程序。

通常,模板会使语言更加复杂(并且难以正确实现!)。模板不是故意设计成图灵完整的,但它们无论如何 - 因此,即使它们可以做任何事情,使用它们可能会变得比它的价值更麻烦。

答案 3 :(得分:4)

My 2c相当消极。

  

C ++类型从未设计用于执行编译时计算。   使用类型实现计算目标的概念非常多   显然是一个黑客 - 而且,一个从来没有被寻求的,而是   偶然发现了

...

  

在代码中使用MP的回报是满足的时刻   解决了一个难谜。你做了100行的东西   否则就把200了。你磨蹭了   难以理解的错误消息,如果需要的话   要将代码扩展到新案例,您将知道确切的3行   模板函数重载。当然,你的维护者会有   无限投资以实现同样的目标。

答案 4 :(得分:2)

应谨慎使用模板。

“糟糕的调试”和“难以阅读”并不是很好的论据,反对良好的模板使用和良好的抽象。

更好的否定论点会指向STL有很多“陷阱”的事实,并且STL已经涵盖的目的使用模板正在重新发明轮子。模板还会增加链接时间,这可能是某些项目的一个问题,并且在语法上有许多对人们来说都很神秘的特性。

但是通用代码重用,类型特征,反射,智能指针甚至元程序的积极因素往往超过负面因素。您必须确定的是,模板始终使用小心谨慎。在每种情况下,它们都不是最佳解决方案,通常甚至不是第二或第三种最佳解决方案。

你需要有足够经验写作的人,他们可以避免所有的陷阱,并且在模板使事情变得复杂而不是帮助时会有很好的关注。

答案 5 :(得分:1)

我看不出它们如何难以阅读。什么是不可读的

vector <string> names;

例如?你会用什么替换它?

答案 6 :(得分:1)

我还没有提到的缺点之一是常规类和类模板实例化之间的细微语义差异。我能想到:

    祖先类型中的
  1. typedef ed类型名称不会被模板类继承。
  2. 需要在适当的位置撒上typenametemplate个关键字。
  3. 会员功能模板不能是virtual
  4. 这些事情通常可以克服,但它们很痛苦。

答案 7 :(得分:1)

有些人讨厌模板(我这样做),因为:

  • 关于可维护性问题,错误使用模板可能会产生比它们应该带来的最初时间优势强十倍的负面影响。
  • 在优化问题上,他们允许的编译器优化与最优算法和多线程的使用无关。
  • 在编译时间pov时,错误使用模板会对解析,编译和链接阶段产生非常不利的影响,当写得不好的模板化声明在每个编译单元中带来大量无用的寄生声明时(这里有200行代码可以生成1Mb的.obj)。

对我来说,模板就像一个带有集成火焰喷射器的电锯,它也可以发射手榴弹。在我生命中的一次,我可能有一个特定的需要。但大多数时候,我使用普通的锤子和简单的锯子来制造东西,而且我的工作做得很好。

答案 8 :(得分:0)

优势:可以创建通用数据类型。

缺点:代码膨胀

答案 9 :(得分:-1)

可重复使用的代码是使用模板制作的。它的应用与每个的概况一致。