非类型模板参数与 非类型类模板参数的使用

<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>





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值