使用模板有哪些缺点?

ani*_*ish 10 c++ templates generic-programming

一些缺点是

  1. 它的语法很复杂
  2. 编译器生成额外的代码

Pot*_*ter 24

他们很难验证.没有使用的模板代码往往很少被编译.因此,必须对测试用例进行良好的覆盖.但是测试是耗时的,然后它可能会变成一开始就不需要强大的代码.

  • 另一个问题可能是模板可用于*阻止*代码编译:例如,确保类模板永远不会使用某些模板参数进行实例化.编写测试验证代码无法编译通常很难.:) (3认同)

Jer*_*ner 22

嗯,怎么样......

3:编译速度慢

4:它们强制在编译时计算事物而不是运行时间(如果您更喜欢快速执行速度而不是运行时灵活性,这也是一个优势)

5:较旧的C++编译器不处理它们,或者没有正确处理它们

6:当您没有正确获取代码时,它们生成的错误消息几乎是不可理解的

  • @GMan:我不同意你的POV#6.对于看起来无辜的`std :: list <int> l; std :: sort(l.begin(),l.end());`VC9向您发出7.5kB错误消息,所有这些消息都指向std lib头.即使我完全理解为什么排序列表的方式不起作用,7.5kB的错误消息也无法理解. (11认同)
  • 我不同意4.在适当时使用模板,如果您需要运行时灵活性,请不要使用模板.除了在旧的代码库中抱怨语言没有意义之外,5应该无关紧要.现代编译器要么免费,要么便宜.6是不确定的.:P了解模板,错误是可以理解的. (8认同)
  • 好吧,他要求任何不利因素,不仅是不可逾越的劣势:) (6认同)
  • 我会说模板的*main*缺点是错误消息很差.它们不容易理解,这也是将概念添加到C++ 0x中的原因之一:改进诊断.我说我非常了解模板,但即使是一个错误就像在一个存储在`unique_ptr`中的类上有一个受保护的析构函数一样简单,这让我在一段时间内思考了一个页面长的错误信息.没用.(是的,我这样做很愚蠢:P但人们总是把手指弄脏,这就是好的诊断很重要的原因) (3认同)

Ale*_*x B 12

模板将您的实现暴露给代码的客户端,这使得如果在库边界传递模板化对象,则会更难以维护ABI.


Ale*_*lli 10

唯一真正的缺点是,如果你做任何微小的语法错误在模板中(尤其是使用用其他模板)的错误消息打算有所帮助......希望几乎无法使用错误的MSG的几页;-).编译器的缺陷是特定于编译器的,而语法虽然丑陋但并不真正"复杂".总而言之 - 尽管有适当的错误诊断存在巨大问题 - 模板仍然关于C++ 唯一最好的事情,但有一点可能诱使您使用C++而不是其他语言使用较差的泛型实现,例如Java ...


j_r*_*ker 10

到目前为止,似乎没有人提到我用模板找到的主要缺点:代码可读性急剧下降!

我不是指语法问题 - 是的,语法很难看,但我可以原谅.我的意思是这样的:我发现,以前从未见过的非模板化代码,无论应用程序多么大,如果我从头开始main()我通常可以解码程序正在做的没有问题的广泛笔画.而仅使用vector<int>或类似的代码并不会让我感到烦恼.但是,一旦代码开始为简单的容器类型之外的目的定义和使用自己的模板,可理解性就会迅速消失. 这对代码维护有非常不利的影响.

其中一部分是不可避免的:模板通过复杂的偏序重载决策规则(对于函数模板)提供更大的表现力,并且在较小程度上提供部分特化(对于类模板).但规则是如此复杂,甚至编译器编写者(我很高兴地承认他比我更聪明一个数量级)仍然在角落案件中弄错了.

在C++中命名空间,朋友,继承,重载,自动转换和依赖于参数的查找的交互已经足够复杂.但是当你在混合中添加模板时,以及它们带来的名称查找和自动转换规则的细微变化,复杂性可以达到我认为没有人可以处理的比例.我只是不相信自己阅读和理解使用所有这些结构的代码.


与模板无关的困难是调试器仍然难以自然地显示STL容器的内容(与C样式数组相比).