<pre name="code" class="cpp">
函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。
当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化,并获得最终代码
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-size:18px;">#include <stdexcept></span></span>
<span style="font-size:18px;">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(): Stack is empty");
}
--numElems;
}
template <typename T,int MAXSIZE>
T Stack<T,MAXSIZE>::top() const
{
if (numElems<=0)
{
throw std::out_of_range("Stack<>::pop(): Stack is empty");
}
return elems[numElems-1];
}
#include <iostream>
#include <string>
#include <cstdlib>
#include "1.h"
int main()
{
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("123321");
std::cout<<stringStack.top()<<std::endl;
stringStack.pop();
stringStack.pop();
}
catch(std::exception const& ex)
{
std::cerr<<"Exception: "<<ex.what()<<std::endl;
return 1;
}
return 0;
}</span>
非类型模板参数的简单调用与模板参数略有不同
<span style="font-size:18px;"><pre name="code" class="cpp" style="font-size: 18px;">template <class type,int x>
type swap_minus(type &m,type &n,int x)
{
type tem;
tem = m;
m = n;
n = tem;
return (m-n)*x;
}</span>
<span style="font-size:18px;">template <class type,int x>
type sw_min(type &m,type &n)
{
type tem;
tem = m;
m = n;
n = tem;
return (m-n)*x;
}</span>
<span style="font-size:18px;">int _tmain(int argc, _TCHAR* argv[])
{
int v1=3;
int v2=8;
int x =2;
std::cout<<swap_minus(v1,v2,x);
std::cout<<sw_min<int,3>(v1,v2);
system("pause");
return 0;
}</span>