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

最新文章

  1. Dancing Links and Exact Cover
  2. 安装Apache报80端口被占用 pid 4
  3. easyUI数据表格datagrid之笔记
  4. 进制格式转换 c#
  5. Asp.Net生命周期系列二
  6. struct TABLE
  7. SQL初级阶段笔记
  8. Linux运维项目实战系列
  9. H5开发中的故障
  10. html标签自带样式总结
  11. [bzoj3668][Noi2014]起床困难综合症/[洛谷3613]睡觉困难综合症
  12. Python迭代器详解
  13. 使用Callable接口创建线程和使用线程池的方式创建线程
  14. [Java]刷题中的Java基础
  15. 10、DOM(文档对象模型)
  16. python摸爬滚打之day12----生成器, 各种生成式
  17. maven的web项目和shiro集成的问题
  18. NC 的高级应用
  19. MySQL数据类型的长度
  20. Qt 5.3更新无数,更改C++控制台输出最为赞

热门文章

  1. Promise对象 异步编程
  2. hostapd阅读(openwrt)-2
  3. laravel 安装语言包
  4. LQB2013A04倒置的标签
  5. emacs 中文手册 命令行精简版
  6. Get与Post的区别?(面试官最想听到的答案)
  7. recv &amp; recvfrom
  8. 实战:docker搭建FastDFS文件系统并集成SpringBoot
  9. Php7+Mysql8实现简单的网页聊天室功能
  10. stm32f407 oled iic例程,成功点亮oled屏