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作为类模板的一个例子。
[第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. 中国工信出版集团, 中国邮电出版社. 北京.
C++ Templates (Part I 基本概念 The Basics)的更多相关文章
- C++ Templates 关于程序库的概念和通用工具
using namespace std所谓的命名空间,就是一种将程序库名称封装起来的方法,它就像在程序库中竖立了一道围墙 标准程序库中有一部分,比如string classes,支持具体的错误处理,它 ...
- Apache Beam编程指南
术语 Apache Beam:谷歌开源的统一批处理和流处理的编程模型和SDK. Beam: Apache Beam开源工程的简写 Beam SDK: Beam开发工具包 **Beam Java SDK ...
- Ember.js学习教程 -- 目录
写在前面的话: 公司的新项目需要用到Ember.js,版本为v1.13.0.由于网上关于Ember的资料非常少,所以只有硬着头皮看官网的Guides,为了加深印象和方便以后查阅就用自己拙劣的英语水平把 ...
- C++ Templates STL标准模板库的基本概念
STL标准库包括几个重要的组件:容器.迭代器和算法.迭代器iterator,用来在一个对象群集的元素上进行遍历操作.这个对象群集或许是一个容器,或许是容器的一部分.迭代器的主要好处是,为所有的容器提供 ...
- 3.1 Templates -- Handlerbars Basics(Handlerbars基础知识)
一.简介 Ember.js使用Handlerbars模板库来强化应用程序的用户界面.它就像普通的HTML,但也给你嵌入表达式去改变现实的内容. Ember使用Handlerbars并且用许多新特性去扩 ...
- Django templates and models
models templates models and databases models 如何理解models A model is the single, definitive source of ...
- 通过实例快速掌握k8s(Kubernetes)核心概念
容器技术是微服务技术的核心技术之一,并随着微服务的流行而迅速成为主流.Docker是容器技术的先驱和奠基者,它出现之后迅速占领市场,几乎成了容器的代名词.但它在开始的时候并没有很好地解决容器的集群问题 ...
- [c++] Templates
Template是编译时多态.所有的模板都是在编译时产生对应的代码,它没有面向对象中的虚表,无法实现动态多态. Function Template A function template is a p ...
- 走进AngularJs(一)angular基本概念的认识与实战
一.前言 前端技术的发展是如此之快,各种优秀技术.优秀框架的出现简直让人目不暇接,作为一名业界新秀,紧跟时代潮流,学习掌握新知识自然是不敢怠慢.当听到AngularJs这个名字并知道是google在维 ...
随机推荐
- Spring Security系列之极速入门与实践教程
@ 目录 1. Spring Security 2. 实验环境准备 3. 日志级别修改 4. 配置用户名/密码 5. 数据库方式校验 6. 不拦截静态资源 7. 自定义登录页面 8. Remember ...
- 04爬取拉勾网Python岗位分析报告
# 导入需要的包import requestsimport time,randomfrom openpyxl import Workbookimport pymysql.cursors#@ 连接数据库 ...
- Java+MySQL企业级实训全套课程
总纲 JAVA基础部分 教学视频:第一讲:Java入门与环境搭建 提取码:h9vm第二讲:变量与运算符 提取码:928t第三讲:顺序结构及条件结构 提取码:3v1l第四讲:while ...
- 深度学习中损失值(loss值)为nan(以tensorflow为例)
我做的是一个识别验证码的深度学习模型,识别的图片如下 验证码图片识别4个数字,数字间是有顺序的,设立标签时设计了四个onehot向量链接起来,成了一个长度为40的向量,然后模型的输入也是40维向量用s ...
- 谁来教我渗透测试——VMware工具安装和使用
今天我们继续渗透测试学习系列了,昨天我们看了基础概念,今天我们来学习一下渗透测试必备的功能VMware安装. 首先我们下载好VMware workstation Pro的安装包.可以在百度上直接百度下 ...
- RHEL7配置ip地址
通过修改ifcfg-eno16777728配置文件来修改配置ip 网卡命令格式:eno16777728 en:代表enthernet(以太网) o:代表onboard(内置) 16777728:是主板 ...
- jupyter的服务器配置安装
该教程主要针对的是服务器安装,且在后台保持稳定运行的情况. 1.jupyter下载 有网的时候 1. pip install jupyter 离线安装 在有网络的环境下载安装包 2. pip down ...
- 第3章 探索性数据分析(单因子&对比)与可视化
1.理论铺垫 Dataframe和Series均适用 ~集中趋势:均值mean().中位数median().与分位数quantile(q=0.25).众数mode() ~离中趋势:标准差std().方 ...
- PHP srand() 函数
实例 播种随机数生成器: <?phpsrand(mktime());echo(rand());?>高佣联盟 www.cgewang.com 定义和用法 srand() 函数播种随机数生成器 ...
- PHP ord() 函数
实例 返回 "h" 的 ASCII值: <?php高佣联盟 www.cgewang.comecho ord("h")."<br>&q ...