仅供自己学习,翻译不一定准确
第一部分 基本概念
第一部分介绍的是C++模板的基本概念和语言特性。该部分首先通过展示函数模板(function templates)和类模板(class templates)来详述C++模板的目标与相关概念。接下来则是讨论一些基本模板,如非类型模板参数(nontype template parameters),可变参数模板(variadic templates),关键字“typename"和成员模板(menber templates)。
同时该部分还讲诉了如何处理移动语义(move semantics),如何声明参数与如何使用泛型代码(generic code)来进行编译时编程(compile-time programming)。最后,该部分还包括了对于相关术语使用的提示,以及作为一位应用程序员或通用库(generic libraries)作者在实际中对C++模板的实践和应用。
为什么要用模板
在C++中,我们去声明变量,函数,和大多数使用特定类型的实体(entities)。但是对于不同类型来说,它们的代码常常看起来十分相似。
举个例子,存放int类型的数组和存放着字符串类型的向量(vectors),只要它们所包含的类型之间能够相互比较出大小,那么它们的快速排序(quicksort)算法的实现从结构上来看就是一模一样的。
如果你使用的编程语言不支持这种泛型的特殊语言特性,那你只能采取以下这几种方法:
1.你可以对那些需要此行为的每个类型实现相同的行为(behavior)。
2.你可以为通用基类型(如实体类(object)和无类型指针(void*))编写通用的代码。
3.你可以使用特殊的预处理器。
如果你以前学过其他编程语言,你可能已经尝试过上面列举的某种或三种方法。然而,它们各自有着缺点:
1.如果你重复为每个类型实现相同的行为,那这就是在浪费时间(reinvent the wheel)。你会在编程中不停碰到相同的错误,而且你会为了不碰见更多的错误而去避免使用那些虽然复杂但是更好的算法。
2.如果你为通用基类编写通用的代码,你会无法享受到类型检查带来的好处。除此之外,碰到某些需要从特殊基类(special base classes)派生出来的类时,你再想要去维护你的代码就会变得难上加难。
3.如果你使用特殊的预处理器,你的代码则会被一些“愚蠢的文本替换机制”(stupid text replacement mechanism)变得不知道范围和类型,这会导致一些非常奇怪的语义错误(semantic errors)。
而模板就是由此而生的。它们是为了那些还没有确定一种或多种类型的函数或模板而被编写出来的。当你使用模板时,类型会作为显式或隐式的参数而被传递。同时又因为模板是C++的语言特性,所以它支持类型检查和范围检查。
在现今的编程中模板十分常见。比如在C++标准库(standard library)中,几乎所有代码都是模板代码。标准库可以提供分类指定类型的实体和值的分类算法,提供管理指定类型元素的数据结构(或称之为容器(container classes)),以及参数化(parameterize)字符类型的字符串等。
无论如何,这只是刚刚开始。模板还允许我们参数化行为,优化代码和参数化信息(parameterize information)。这些相关应用会在后面的章节中提到。我们先从一些简单的模板开始讲起。