特例化模板

c++容許咱們對模板進行特例化,當對特殊的類型進行模板化時,通常性已經不知足咱們的應用了。ios

考慮一個例子:c++

template<class T>函數

class Stackspa

{調試

 .....
};ci

特例化模板分爲兩種:get

(1)一種是對整個類進行特例化string

例如:io

#include<string>模板

template<>

class Stack<std::string>

{

.....;
};

使用這種方法須要對整個類的成員函數進行編寫:

在定義函數時使用如下方式

template<>

type Stack<std::string>::funcname(...)

{
}

 

(2)還有一個就是對類中的個別成員函數進行特例化

這種方法只須要在定義成員函數的時候進行例外的編寫,形式以下:

template<>

type Stack<int>::funcname(...)

{
}

 

下面附上完整的源代碼例子:

//////////////////////////////////////////

////Stack.h file

#include<deque>
#include<string>
#include<stdexcept>

////////////////////
//通常的模板類 
template<class T>
class Stack
{
public:
    void pop();
    T Top();
    void push(const T& value);
    bool Empty()
    {
        return (de.size()==0);
    }
private:
    std::deque<T> de;
};

///////////////////////////////
//所有特例化類模板 
template<>
class Stack<std::string>
{
    public:
    void pop();
    std::string Top();
    void push(const std::string& value);
    bool Empty()
    {
        return (de.size()==0);
    }
private:
    std::deque<std::string> de;
};

//////////////////////////////
///通常模板的實現 
template<class T>
void Stack<T>::pop()
{
    if( Empty() )
    {
        throw std::out_of_range("堆棧中爲空");
    }
    de.pop_back();
}

template<class T>
void Stack<T>::push(const T& value)
{
    de.push_back(value);
}

//局部特例化 
template<>
void Stack<int>::push(const int & value)
{
    de.push_back(value);
}

template<class T>
T Stack<T>::Top()
{
    if( Empty() )
    {
        throw std::out_of_range("堆棧中爲空");
    }
    T value=de.back();
    return value;
}
//////////////////////////////////////////////
///通常的模板實現完畢
 
//////////////////////////////////////////
//特殊的模板實現
void Stack<std::string>::pop()
{
    if( Empty() )
    {
        throw std::out_of_range("堆棧中爲空");
    }
    de.pop_back();
}

void Stack<std::string>::push(const std::string& value)
{
    de.push_back(value);
}

std::string Stack<std::string>::Top()
{
    if( Empty() )
    {
        throw std::out_of_range("堆棧中爲空");
    }
    std::string value=de.back();
    return value;

 

////////////////////////////////////////////////////////////////

////main.cpp

#include <cstdlib>
#include <iostream>
#include "Stack.h"

using namespace std;

int main(int argc, char *argv[])
{
    try
    {
        Stack<int> intstack;
        Stack<string> stringstack;
        intstack.push(10);
        cout<<intstack.Top()<<endl;
        intstack.pop();
    
        stringstack.push("helle world");
        cout<<stringstack.Top()<<endl;
        stringstack.pop();
    }catch(exception error)
    {
        cout<<error.what()<<endl;
    }
    cout << "Press the enter key to continue ...";
    cin.get();
    return EXIT_SUCCESS;
}

 

 

若是想要對他函數的的調用進行詳細的瞭解,只須要設置相應的斷點並調試。

相關文章
相關標籤/搜索