在编写通用类时,模板也允许使用参数化的常量。在堆栈的例子里,我们可以指定堆栈的大小并把它放在模板的声明语句里。
TemplateStack.h
//在模板声明语句里指定堆栈大小
template <class T,short sSize=100>
class Stack
{
public:
Stack()
{
m_sPos=0;
}
~Stack(){}
void Push(T value);
T Pop();
bool IsEmpty()
{
return m_sPos==0;
}
bool HasElements()
{
return m_sPos!=0;
}
bool IsFull()
{
return m_sPos==sSize;
}
long GetSize()
{
return sSize;
}
private:
T m_data[20];
short m_sPos;
};
//template <class T,short sSize=20> //default template arguments are only allowed on a class template
template <class T,short sSize>
//void Stack<T>::Push(T value) //template argument list following class template name must list parameters in the order used in template parameter list
void Stack<T,sSize>::Push(T value)
{
m_data[m_sPos++]=value;
}
template <class T,short sSize>
T Stack<T,sSize>::Pop()
{
return m_data[--m_sPos];
}
main.cpp
#include "TemplateStack.h"
#include <iostream>
using namespace std;
int main()
{
Stack<double,20> doubleStack;
//Create a stack of doubles with a max size of 20 elements
cout<<"doubleStack size is "<<doubleStack.GetSize()<<endl;
doubleStack.Push(1.1);
doubleStack.Push(2.2);
doubleStack.Push(3.3);
cout<<"The elements in the stack:"<<endl;
while(doubleStack.HasElements())
{
cout<<doubleStack.Pop()<<endl;
}
cout<<endl;
//a dynamic created stack
Stack<long,10> *plongStack=new Stack<long,10>;
cout<<"plongStack size is "<<plongStack->GetSize()<<endl;
plongStack->Push(1000);
plongStack->Push(2000);
cout<<"The elements in the stack:"<<endl;
while(plongStack->HasElements())
{
cout<<plongStack->Pop()<<endl;
}
delete plongStack;
return 0;
}
//模板类的实现不能和声明分离的。
//并非所有编译器都支持export关键字,且性能太差。
运行结果:
但是不能动态设定该堆栈模板类中元素的最大长度?