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;
}
若是想要對他函數的的調用進行詳細的瞭解,只須要設置相應的斷點並調試。