非类型的类模板参数

参考《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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值