【C++】为什么要使用模板?

在声明变量、函数和大多数其他类型的实体的时候,C++要求我们使用指定的类型。然而,对于许多代码,除了类型不同之外,其余的代码看起来都是相同的。特别是当你实现诸如quicksort的算法,或者为不同的类型实现诸如链接表或者二叉树数据结构的行为时,这些代码除了类型有区别之外,其余的都是相同的。

假想程序设计语言并不支持这个语言特性(即模板),为了实现相同的功能,你只能使用下面这些糟糕的替代方法。

  1. 针对每个所需相同行为的不同类型,你可以一次又一次地实现它。
  2. 你可以把通用代码放在一个诸如Object或者void*的公共基础类(common base class)里面。
  3. 你可以使用特殊的预处理程序。

如果原来所使用的语言是C、Java或者类似的语言,那么你可能就不得不选择上面的一或多种替代方法。然而,每一种替代方法都有自身的缺点。

  1. 如果你一次又一次地实现同一个行为,那么你就做了许多重复的工作。你会犯同一个错误;你还会舍弃复杂但更好用的算法;因为复杂算法通常都趋向于引入更多的错误 [1] 。
  2. 如果你借助公共基类来编写通用代码,那么你将失去类型检查这个优点。另外,对于以后实现的许多类,都必须继承自某个特定的基类,这会令代码的维护更加困难。
  3. 如果你使用了一个诸如C或C++预处理器的预处理程序,那么你将会失去“源代码具有很好的格式”这个优点。你必须使用一些“愚蠢的文本替换机制”来替换源代码,而这将不会考虑作用域和类型。

然而,应用模板的解决方案却没有这些缺点。模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,你只需要把所希望的类型作为一个(显式或者隐式的)实参传递给模板。另外,由于模板是语言本身所具有的特性,所以它完全支持类型检查和作用域。

在现今的程序中,模板的应用非常广泛。例如,在C++标准库中,几乎所有的代码都是模板代码。程序库提供了多种模板:可以对指定类型的对象和值排序的排序算法;用于管理指定类型元素的数据结构(也称为容器类);可以对字符进行参数化的字符串,等等。然而,这仅仅是简单的模板应用,模板还允许我们对行为进行参数化、优化代码,甚至对一些内容进行参数化,等等。

总结

模版可以:

  • 精简代码
  • 类型检查
  • 预处理
参考

[美]David Vandevoorde、[德]Nicolai M. Josuttis 著. “C++ Templates中文版 (C和C++实务精选)。”

总结,今天准备看完第一章来着。。发现第一章如此精简,是不是应该先看一下目录。。

发布了423 篇原创文章 · 获赞 14 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/LU_ZHAO/article/details/105480450