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在维 ...
随机推荐
- ORACLE_19c用户密码登录失败的问题以及ORA-28040
测试环境19c 本地登录无异常,创建测试用户,电脑Plsql登录提示报错ORA-28040,处理后再次登录提示密码错误,最后重置密码再次登录OK? 通过这个问题再次测试及反思: 1.ORA-28040 ...
- Ansible部署zabbix-agent
playbook目录 zabbix/ ├── hosts ##定义的主机列表 ├── install_zabbix_agent.yml ##安装入口文件 └── roles ├── install_z ...
- Java的常用类——Object类、String类
Java的JDK中提供给我们很多封装好的类就是Java API,可以直接调用. Java 的API(API: Application(应用) Programming(程序) Interface(接口) ...
- JVM系列之:String.intern的性能
目录 简介 String.intern和G1字符串去重的区别 String.intern的性能 举个例子 简介 String对象有个特殊的StringTable字符串常量池,为了减少Heap中生成的字 ...
- functools 中的 reduce 函数基本写法
reduce 返回的往往是一整个可迭代对象的 操作结果 reduce(函数,可迭代对象) 注:lambda x,y 两个参数 2020-05-04
- PDOStatement::getAttribute
PDOStatement::getAttribute — 检索一个语句属性(PHP 5 >= 5.1.0, PECL pdo >= 0.2.0)高佣联盟 www.cgewang.com 说 ...
- luogu 3158 [CQOI2011]放棋子
时隔多日 我又来挑战这道dp. 几个月前给写自闭了.几个月后再来. 首先一个我们能列出来的状态 是以行为转移的 f[i]表示前i行...但是会发现此时列我们控制不了 且棋子的颜色,个数我们也要放到状态 ...
- 最优化算法【牛顿法、拟牛顿法、BFGS算法】
一.牛顿法 对于优化函数\(f(x)\),在\(x_0\)处泰勒展开, \[f(x)=f(x_0)+f^{'}(x_0)(x-x_0)+o(\Delta x) \] 去其线性部分,忽略高阶无穷小,令\ ...
- QString字符串的查找与截取实例
QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...
- CI4框架应用五 - 加载视图
这节我们来看一下CI4框架中视图的加载, CI4中提供了几种方式加载视图. 1. 利用CI4框架提供的全局函数view(‘模板名’),如果需要传参数可以在第二个参数传一个数组 我们先修改一下之前定义的 ...