设为首页 加入收藏

TOP

3.2 类模板Stack的使用
2013-10-07 00:05:48 来源: 作者: 【 】 浏览:63
Tags:3.2 模板 Stack 使用

3.2  类模板Stack的使用

为了使用类模板对象,你必须显式地指定模板实参。下面的例子展示了如何使用类模板Stack<>:

//basics/stack1test.cpp
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack1.hpp"

int main()
{
try {
Stack<int>           intStack;        // 元素类型为int的栈
Stack<std::string> stringStack; // 元素类型为字符串的栈

        // 使用int栈
intStack.push(7);
std::cout << intStack.top() << std::endl;

        // 使用string栈
stringStack.push("hello");
std::cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
}
catch (std::exception const& ex) {
std::cerr << "Exception: " << ex.what() << std::endl;
return EXIT_FAILURE;  // 程序退出,且带有ERROR标记
}
}

通过声明类型Stack<int>,在类模板内部就可以用int实例化T。因此,intStack是一个创建自Stack<int>的对象,它的元素储存于vector,且类型为int。对于所有被调用的成员函数,都会实例化出基于int类型的函数代码。类似,如果声明和使用Stack<std::string>,将会创建一个Stack<std::string>对象,它的元素储存于vector,且类型为std::string;而对于所有被调用的成员函数,也会实例化出基于std::string的函数代码。

注意,只有那些被调用的成员函数,才会产生这些函数的实例化代码。对于类模板,成员函数只有在被使用的时候才会被实例化。显然,这样可以节省空间和时间;另一个好处是:对于那些“未能提供所有成员函数中所有操作的”类型,你也可以使用该类型来实例化类模板,只要对那些“未能提供某些操作的”成员函数,模板内部不使用就可以。例如,某些类模板中的成员函数会使用operator<来排序元素;如果不调用这些“使用operator<的”成员函数,那么对于没有定义operator<的类型,也可以被用来实例化该类模板。

在上面的例子中,缺省构造函数、push()和top()都被实例化了一个int版本和一个string版本;而pop()仅被实例化了一个string版本。另一方面,如果类模板中含有静态成员,那么用来实例化的每种类型,都会实例化这些静态成员。

你可以像使用其他任何类型一样地使用实例化后的类模板类型(如Stack<int>),只要它支持所调用的操作就可以:

void foo(Stack<int> const& s) //参数s是int栈,即Stack<int>
{
Stack<int> istack[10]; //istack是含有10个int栈的数组
...
}

借助于类型定义,你可以更方便地使用类模板:

typedef Stack<int> IntStack;

void foo(IntStack const& s)  //s是一个int栈
{
IntStack istack[10];  //istack是一个含有10个int栈的数组
...
}

C++(www.cppentry.com)的类型定义只是定义了一个“类型别名”,并没有定义一个新类型。因此,在进行类型定义:

typedef Stack<int> IntStack;

之后,IntSatck和Stack<int>实际上是相同的类型,并可以用于相互赋值。

模板实参可以是任何类型,诸如指向浮点型的指针,甚至元素类型为int的Stack都可以作为模板实参:

Stack<float*>  floatPtrStack; //元素类型为浮点型指针的栈
Stack<Stack<int> > intStackStack; //元素类型为int栈的栈

唯一的要求就是:该类型必须提供被调用的所有操作。

另外,你需要在两个靠在一起的模板尖括号(即>)之间留一个空格;否则,编译器将会认为你是在使用operator>>,而这将会导致一个语法错误:

Stack<Stack<int>> intStackStack; //ERROR:这里不允许使用>>


回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.2 非类型的函数模板参数 下一篇C#入门经典 前言

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: