我一直在和朋友们谈论关于C++模板的使用,有些人完全赞成使用它,而另一些人则完全不同意。
其中一些好处包括:
- 它们更加安全易用(类型安全)。
- 它们是为API进行泛化的好方法。
你还能告诉我哪些关于C++模板的好处呢?
那么又有哪些关于C++模板的坏处呢?
编辑:我之所以问这个问题是因为我正在备考考试,目前正在学习C++模板的主题。所以我想更多地了解它们。
模板是一种非常强大的机制,可以简化很多事情。但是要正确使用它们需要大量的时间和经验 - 以决定何时适当地使用它们。
对我来说,最重要的优点是:
for
和for_each
之间有什么区别)parallel_for
和其他STL类似的算法和容器)
缺点:
export
支持(缺乏)我强烈推荐以下书籍:
从积极的角度来看,C++模板:
允许类型泛化
减少了需要键入的冗余代码量
有助于构建类型安全代码
在编译时进行评估
可以提高性能(作为多态的替代方案)
有助于构建非常强大的库
从消极的角度来看:
如果不小心使用,可能会很快变得复杂。
大多数编译器会给出晦涩的错误消息。
使用/调试高度模板化的代码可能很困难。
至少有一个语法怪癖(>>运算符可能会干扰模板)。
帮助使C++非常难以解析。
总之,应谨慎考虑何时使用模板。
我的看法比较消极。
C++类型从未被设计成用于在编译时进行计算。使用类型来实现计算目标的概念显然是一种hack,而且这种hack是无意中发现的,而不是有意寻找的。
..
在代码中使用MP的奖励是满足解决难题的瞬间。你用100行代码完成了本应需要200行才能完成的工作。你通过费解的错误消息坚持了下来,最终找到了一个精确的3行模板函数来重载。当然,你的维护者们将不得不投入更多的时间来实现相同的效果。
模板应该谨慎使用。
"难以调试"和"难以阅读"不是反对良好的模板使用和良好抽象的好论点。
更好的负面论点应该指向STL有很多"陷阱",并且将模板用于STL已经涵盖的目的是重复造轮子。 模板还会增加链接时间,这可能对某些项目产生影响,并且在语法上具有许多奇特之处,可能对人们来说很晦涩。
但是通用代码重用、类型特征、反射、智能指针甚至元编程的积极因素往往超过了消极因素。您必须确保模板总是被小心和节约地使用。 它们并不是每种情况下最好的解决方案,甚至常常不是第二或第三的最佳解决方案。
您需要拥有足够经验的人来编写模板,他们可以避免所有陷阱,并对模板何时会使事情变得更加复杂有良好的判断。
我不明白它们为什么难以阅读。有什么不可读之处吗?
vector <string> names;
举个例子?你会用什么来替换它?
可重用的代码是使用模板制作的。它的应用根据每个文件的配置进行。
std::function
类型使用类型擦除来允许它引用函数指针和lambda函数。这是类型擦除有用的一个例子,但总的来说,与具体化的泛型或模板相比,类型擦除有很多缺点,这就是为什么大多数语言通常选择更好的方法的原因。 - Pharap