C++ Templates (2.2 使用Stack类模板 Use of Class Template Stack )
2.2 使用Stack类模板 Use of Class Template Stack
在C++17以前,使用类模板必须显式指定模板实参[1]。以下例子展示如何使用类模板Stack<>
// basics/stack1test.cpp
#include "stack1.hpp"
#include <iostream>
#include <string>
int main()
{
Stack<int> intStack; //int类型的栈
Stack<std::string> stringStack; //string类型的栈
//操作int类型的栈
intStack.push(7);
std::cout << intStack.top() << '\n';
//操作string类型的栈
stdString.push("hello");
std::cout << stringStack.top() << '\n';
stringStack.pop();
}
通过声明类型Stack,int作为类模板内T的类型。因此,intStack为一个使用vector为元素的对象,任何被调用的成员函数将相应地实例化。相似地,通过声明Stackstd::string,创建一个使用vectorstd::string为元素的对象,任何被调用的成员函数将相应地实例化。
注意,只有被调用的模板(成员)函数代码才能被实例化。对于类模板,成员函数只有被调用才会实例化。这节省了时间和空间,同时也使得类模板可以被部分使用,这将在第2.3节中讨论。
本例中,int类型和string类型的默认构造函数、push()
函数、top()
函数都将被实例化,然而pop()
函数只有string类型的进行了实例化。如果类模板有静态成员,这些静态成员也只实例化一次,而且只有使用了类模板的那一种类型进行了实例化。
实例化后的类模板类型可以像其他类型一样使用,可以用const或者volatile进行限定,或者基于它衍生出数组和引用。也可以将其作为typedef或者using进行类型定义的一部分(更多类型定义的内容详见第2.8节),或者当构建其他模板类型时作为类型参数,比如:
void foo(Stack<int> const& s) //参数s是int的Stack
{
using IntStack = Stack<int>; //IntStack是Stack<int>的别名
Stack<int> istack[10]; //istack是长度为10的Stack<int>的数组
IntStack istack2[10]; //istack2也是长度为10的Stack<int>的数组
}
模板实参可以是任何类型,比如float类型的指针,甚至是int的Stack:
Stack<float*> floatPtrStack; //float指针的Stack
Stack<Stack<int>> intStackStack; //int的Stack的Stack
唯一的要求便是任何被调用的操作对于该类型是可行的。
注意到,C++11之前必须在两个闭模板括号(closing template brackets)之间放置空格:
Stack<Stack<int> > intStackStack; //任何C++版本都没问题
如果不这么做而使用符号 >>,这将导致语法错误:
Stack<Stack<int>> intStackStack; //C++11之前将引发错误
旧版本的这种行为的原因是这可以帮助C++编译器在第一轮中将源代码分成独立语义的片段(tokenize the source code independent of the semantics of the code)。然而,由于缺失空格是个典型的bug,这需要对应的错误消息,该代码的语义将越来越难以考虑在内。因此C++11移除了“在两个闭合模板括号中间必须加入空格”的规则,史称“角括号hack”(详见13.3.1节)。
脚注
C++17引入了类模板实参推断,这使得可以跳过指定模板实参,只要可以从构造函数推断出模板实参。这将在2.9节中详细讨论。 ︎
C++ Templates (2.2 使用Stack类模板 Use of Class Template Stack )的更多相关文章
- C++ Templates (2.1 类模板Stack的实现 Implementation of Class Template Stack)
返回完整目录 目录 2.1 类模板Stack的实现 Implementation of Class Template Stack 2.1.1 声明类模板 Declaration of Class Te ...
- C++类模板
在上篇文章(C++函数模板)中,主要介绍了C++中函数模板,与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型的例子, 本文地址:http://www.cnblogs.com ...
- C++:类模板与模板类
6.3 类模板和模板类 所谓类模板,实际上是建立一个通用类,其数据成员.成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表.使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从 ...
- C++学习笔记36:类模板
类模板的目的 设计通用的类型式,以适应广泛的成员数据型式 类模板的定义格式 template<模板形式参数列表>class 类名称{...}; 原型:template<typenam ...
- 初步C++类模板学习笔记
类模板 实现:在上课时间的定义给它的一个或多个参数,这些参数代表了不同的数据类型. -->抽象的类. 在调用类模板时, 指定參数, 由编 ...
- C++_进阶之函数模板_类模板
C++_进阶之函数模板_类模板 第一部分 前言 c++提供了函数模板(function template.)所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来 ...
- C++17尝鲜:类模板中的模板参数自动推导
模板参数自动推导 在C++17之前,类模板构造器的模板参数是不能像函数模板的模板参数那样被自动推导的,比如我们无法写 std::pair a{1, "a"s}; // C++17 ...
- 使用js栈stack类的实现
使用js栈stack类的实现 /*使用栈stack类的实现*/ function stack() { this.dataStore = [];//保存栈内元素,初始化为一个空数组 this.top = ...
- Java的Stack类实现List接口真的是个笑话吗
今天在网上闲逛时看到了这样一个言论,说“Java的Stack类实现List接口的设计是个笑话”. 当然作者这篇文章的重点不是这个,原本我也只是一笑置之,然而看评论里居然还有人附和,说“Ja ...
随机推荐
- Codeforces Round #654 (Div. 2) A~E 题解
LINK:CF R 654 div2 前言:F题是一个线段树分类讨论的题目 比赛的时候没看 赛后感觉没什么意思 所以咕掉了. 记事:第一次笼统的写一场比赛的题目 可能是我这场比赛打的太差了 题目不难 ...
- 10分钟 Castle.Windsor 适配 Asp.Net Core 3.0
Asp.Net Core 3.0以上,不再能通过修改Starup.ConfigureServices返回值(IServiceProvider),所以只能调用IHostBuilder.UseServic ...
- 使用cors完成跨域请求处理
跨域的含义 同源策略以及其限制内容 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS.CSFR等攻击.所谓同源是指"协议+域名+端口&quo ...
- 2020 重新出发,JAVA 学习计划
------ @[toc]# 前言 我呢已经工作七年了,一直没有换工作,因为我这个人没什么太大的野心,安安稳稳的生活就挺好,目前的公司虽然福利一般,但是工作稳定,环境也都很熟悉了. 但是今年,到目前为 ...
- [学习笔记] Numpy基础 系统学习
[学习笔记] Numpy基础 上专业选修<数据分析程序设计>课程,老师串讲了Numpy基础,边听边用jupyter敲了下--理解+笔记. 老师讲的很全很系统,有些点没有记录,在PPT里就不 ...
- 剑指Offer——II平衡二叉树
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None # 这道题使用中序遍历加上 ...
- ExcelWeb脚本助手,自定义脚本,批量操作Excel与网页
ExcelWeb脚本助手,是一款可以自定义脚本操控Excel和浏览器的工具.提供了简单实用的Excel与Browser的API调用,通过自建脚本或自建项目,随意定制. 可以非常方便的根据Excel中的 ...
- 树莓派搭建网站wordpress的url写错 问题解决方法 有效GUI方法
这个时候wordpress的后台已经登陆不了了,所以要对数据库做一些改变. 先说一下我是跟b站韩博士学的,LNMP.如果我们用的不一个方法的话下面就不用看了.下面是具体方法: 1 浏览器登录phpm ...
- 浏览器自动化的一些体会5 webBrowser控件之winform和webBrowser的交互
从winform访问webBrowser,大致就是利用webBrowser提供的解析dom的方法以及用InvokeScript方法执行javascript.这个相对比较简单. 从webBrowser访 ...
- 图片降噪(Scipy)
以登月图片为例,通过使用Scipy 傅立叶变换,实现图片消噪 scipy.fftpack模块用来计算快速傅里叶变换速度比传统傅里叶变换更快,是对之前算法的改进图片是二维数据,注意使用fftpack的二 ...