C++ Templates (Part I 基本概念 The Basics)
C++ 模板 (C++ Templates)
第一部分 基本概念 (The Basics)
这一部分介绍C++模板常见的概念和语言特性,通过展现函数模板(function templates)和类模板(class templates)例子的方式,从讨论C++模板的通用目标和概念入手,继而介绍一些基本的模板特性,比如,非类型模板参数(nontype template parameters)、可变参数模板(variadic templates)、关键字typename和成员模板(member templates)。同时,这一部分还将讨论如何处理移动语义(move semantics)、如何声明参数,以及如何使用泛型代码(generic code)来进行编译期编程(compile-time programming)。最后以一些通用术语的描述和实践中(不管作为应用程序员还是通用库的作者)使用C++模板的技巧结尾。
为什么使用模板? Why Templates?
C++ 需要使用特定的类型声明变量、函数和大多数的实体。然而,有许多代码完全一样,除了类型不同,比如快速排序算法quicksort对不同的数据结构具有结构一样的代码,这些数据结构可以是int的数组int [N],字符类型string组成的vecotr,只要容器包含的类型可以相互比较。
如果使用的编程语言不支持这种泛型特性,那么可以有以下几种不好的替代方案:
- 为每一种需要的类型独立、重复地实现同样的功能。
- 为共同的基类如Object或者void* 写通用的实现代码。
- 使用特殊的预处理器。
如果你之前使用其他的编程语言,那么你可能实现过部分或者以上的所有方式。然而,以上每一种方法都有各自的缺陷:
- 如果为每一种需要的类型独立、重复地实现同样的功能,这将导致重复造轮子(reinvent the wheel)。同样的错误,将会遍布所有的类型中,这导致错过更复杂但更好的算法,因为这甚至会引起更多的错误。
- 如果为共同的基类写通用的实现,这将导致失去类型检查的优势,并且,所有的类都将继承自某一特殊的基类,使得代码维护变得困难。
- 如果使用预处理器,那么代码将被一些“愚蠢的文字替换机制”取代,没有范围和类型的概念,将导致一些奇怪的语义错误。
模板是针对这个问题的一个解决方案,且没有上述缺陷。模板是为一种或多种还未指定的类型而写的函数或者类。当使用模板,传递类型作为参数,不管显式(explicitly)或者隐式(implicitly)。由于模板是C++的语言特性,将得到类型检查和范围的完美支持。
现代程序中,模板已经被广泛使用。比如说,C++标准库中的代码几乎全部都是模板代码。标准库提供了排序算法,以对某种特殊类型的对象(objects)和值(values)进行排序,或者对容器类(container class,一种管理指定类型元素的类)数据结构、用字符进行模板参数化的string进行排序。然而,这仅仅是开始。模板允许参数化行为(parameterize behavior),优化代码,参数化信息(parameterize information)。这些应用将在后续章节中覆盖,当然先从一些简单的模板开始。
第一部分章节目录
[第1章 函数模板 Function Templates]
本章介绍函数模板。函数模板是参数化的模板(functionas that are parameterized),因此可以用来表示一系列的函数。
- 1.1 初窥函数模板 A First Look at Function Templates
- 1.2 模板实参推断 Template Argument Deduction
- 1.3 多模板参数 Multiple Template Parameters
- 1.4 默认模板实参 Default Template Arguments
- 1.5 重载函数模板 Overloading Function Templates
- 1.6 但是为什么不...? But, Should't We ...?
- 1.7 总结 Summary
[第2章 类模板 Class Template]
与函数类似,类也可以将一个或多个类型参数化。容器类,用于管理特定类型的成员,就是该特性的经典案例。通过使用类模板便可实现这样的容器并保持元素类型开放。本章使用栈Stack作为类模板的一个例子。
- 2.1 类模板Stack的实现 Implementation of Class Template Stack
- 2.2 使用Stack类模板 Use of Class Template Stack
- 2.3 类模板的局部使用 Partial Usage of Class Templates
- 2.4 友元 Friends
[第3章 非类型模板参数 Nontype Template Parameters]
[第4章 可变参数模板 Variadic Templates]
[第5章 基础技术 Tricky Basics]
[第6章 移动语义与enable_if<> Move Semantics and enable_if<>]
[第7章 按值传递还是按引用传递? By Value or by Reference?]
[第8章 编译时编程 Compile-Time Programming]
[第9章 在实战中使用模板 Using Templates in Practice]
[第10章 基本模板术语 Basic Template Terminology]
[第11章 泛型库 Generic Libraries]
参考资料
[1] C++ Templates (第二版 英文版). David Vandevoorde, Nocolai M. Josuttis and Douglas Gregor. 中国工信出版集团, 中国邮电出版社. 北京.