参考《C++ Templates》一书。
关于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。
当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化,并获得最终代码。
详细解释可参考一下代码:
stack4.hpp
#ifndef _STACK4_H_
#define _STACK4_H_
#include <stdexcept>
/**
* @class:栈的类模板
* @param: typename T: 模板参数,栈存储元素的类型
* @param:int MAXSIZE: 栈元素的最大个数
* note:模板参数并不局限于类型,普通值也可以作为模板参数
*/
template<typename T, int MAXSIZE>
class Stack
{
private:
T elems[MAXSIZE]; //包含元素的数组
int numElems; //元素的当前个数
public:
Stack();
void push(T const&); //压入元素
void pop(); //弹出元素
T top() const; //返回栈顶元素
bool empty() const //返回栈是否为空
{
return numElems == 0;
}
bool full() const //返回栈是否已满
{
return numElems == MAXSIZE;
}
};
//构造函数/////////////////////////////////////////////
template<typename T, int MAXSIZE>
Stack<T, MAXSIZE>::Stack()
:numElems(0) //初始时栈不含元素
{
}
//压入元素/////////////////////////////////////////////
template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push( T const& elem)
{
if(numElems == MAXSIZE)
{
throw std::out_of_range("Stack<>::push(): stack is full");
}
elems[numElems] = elem; //压入元素
++numElems; //增加元素个数
}
//弹出元素/////////////////////////////////////////////
template<typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop()
{
if(numElems <= 0)
throw std::out_of_range("Stack<>::pop(): empty stack");
--numElems; //减少元素个数
}
//返回栈顶元素/////////////////////////////////////////
template<typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{
if(numElems <= 0)
throw std::out_of_range("Stack<>::pop(): empty stack");
return elems[numElems - 1]; //返回最后一个元素
}
#endif
main.cpp
/************************************************************************
* @filename: non-type template parameters
* @author: JackyLiu
* @Date: 2013-6-26
*************************************************************************/
#include <iostream>
#include <string>
#include <cstdlib>
#include "stack4.hpp"
int main(int argc, char* argv[])
{
try
{
Stack<int, 20> int20Stack; //可以存储20个int元素的栈
Stack<int, 40> int40Stack; //可以存储40个int元素的栈
Stack<std::string, 40> stringStack; //可以存储40个string元素的栈
//使用可存储20个int元素的栈
int20Stack.push(7);
std::cout << int20Stack.top() << std::endl;
int20Stack.pop();
//使用可存储40个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;
int i;
std::cin >> i;
return EXIT_FAILURE; //退出程序且有ERROR标记
}
}
运行结果:
原文链接: https://www.cnblogs.com/liu-jun/p/3157591.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/93609
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!