您的位置:首页 > 编程语言 > C语言/C++

C++ Templates (2.2 使用Stack类模板 Use of Class Template Stack )

2020-09-01 22:33 1726 查看

返回完整目录

目录

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<https://www.cnblogs.com/kaycharm/p/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为元素的对象,任何被调用的成员函数将相应地实例化。相似地,通过声明Stackhttps://www.cnblogs.com/kaycharm/p/std::string,创建一个使用vectorhttps://www.cnblogs.com/kaycharm/p/std::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节)。

脚注

  1. C++17引入了类模板实参推断,这使得可以跳过指定模板实参,只要可以从构造函数推断出模板实参。这将在2.9节中详细讨论。 ↩︎

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐