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,只要容器包含的类型可以相互比较。

如果使用的编程语言不支持这种泛型特性,那么可以有以下几种不好的替代方案:

  1. 为每一种需要的类型独立、重复地实现同样的功能。
  2. 为共同的基类如Object或者void* 写通用的实现代码。
  3. 使用特殊的预处理器。

如果你之前使用其他的编程语言,那么你可能实现过部分或者以上的所有方式。然而,以上每一种方法都有各自的缺陷:

  1. 如果为每一种需要的类型独立、重复地实现同样的功能,这将导致重复造轮子(reinvent the wheel)。同样的错误,将会遍布所有的类型中,这导致错过更复杂但更好的算法,因为这甚至会引起更多的错误。
  2. 如果为共同的基类写通用的实现,这将导致失去类型检查的优势,并且,所有的类都将继承自某一特殊的基类,使得代码维护变得困难。
  3. 如果使用预处理器,那么代码将被一些“愚蠢的文字替换机制”取代,没有范围和类型的概念,将导致一些奇怪的语义错误。

模板是针对这个问题的一个解决方案,且没有上述缺陷。模板是为一种或多种还未指定的类型而写的函数或者类。当使用模板,传递类型作为参数,不管显式(explicitly)或者隐式(implicitly)。由于模板是C++的语言特性,将得到类型检查和范围的完美支持。

现代程序中,模板已经被广泛使用。比如说,C++标准库中的代码几乎全部都是模板代码。标准库提供了排序算法,以对某种特殊类型的对象(objects)值(values)进行排序,或者对容器类(container class,一种管理指定类型元素的类)数据结构、用字符进行模板参数化的string进行排序。然而,这仅仅是开始。模板允许参数化行为(parameterize behavior),优化代码,参数化信息(parameterize information)。这些应用将在后续章节中覆盖,当然先从一些简单的模板开始。

第一部分章节目录

[第1章 函数模板 Function Templates]

本章介绍函数模板。函数模板是参数化的模板(functionas that are parameterized),因此可以用来表示一系列的函数。

[第2章 类模板 Class Template]

与函数类似,类也可以将一个或多个类型参数化。容器类,用于管理特定类型的成员,就是该特性的经典案例。通过使用类模板便可实现这样的容器并保持元素类型开放。本章使用栈Stack作为类模板的一个例子。

[第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. 中国工信出版集团, 中国邮电出版社. 北京.

posted @ 2020-08-04 17:03  失落孤舟  阅读(486)  评论(0编辑  收藏  举报