非型別的類别範本引數

陽光守望者發表於2013-06-26

參考《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標記
    }
}

執行結果:

 

 

相關文章