C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)
接上一篇文章https://blog.csdn.net/Master_Cui/article/details/111824064
四、類别範本的區域性特化
類别範本可以被區域性特化(只指定部分模板引數而不指定所有模板引數)。因為區域性特化仍然保留著未指定的模板引數,所以,區域性特化的類别範本仍然是個類别範本,而不是類别範本的例項
此外,只能對類别範本進行區域性特化,不能對函式模板進行區域性特化
示例
template <typename T1, typename T2>
class test
{
public:
test(){cout<<__func__<<endl;}
};
template <typename T>
class test<T, T>
{
public:
test(){cout<<"test<T, T>"<<endl;}
};
template <typename T>
class test<T, int>
{
public:
test(){cout<<"test<T, int>"<<endl;}
};
template <typename T1, typename T2>
class test<T1 *, T2 *>
{
public:
test(){cout<<"test<T1 *, T2 *>"<<endl;}
};
int main(int argc, char const *argv[])
{
test<int, float> t1;
test<float, float> t2;
test<float, int> t3;
test<int *, float *> t4;
//test<int, int> t5;
return 0;
}
第35行會產生二義性錯誤,因為會同時匹配class test<T, int>和class test<T, T>
五、類别範本的預設模板實參
類别範本可以為模板引數提供預設實參,比如可以為mystack提供預設的實現容器
template <typename T, typename CONT = deque<T>>
class mystack
{
public:
mystack();
mystack(const mystack<T, CONT> &rval);
mystack<T, CONT> &operator=(const mystack<T, CONT> &rval);
~mystack();
void push(const T &ele);
void pop();
T top() const;
bool empty() const {
return elem.empty();
}
private:
CONT elem;
};
template <typename T, typename CONT>
mystack<T, CONT>::mystack()
{
cout<<__func__<<endl;
}
template <class T, typename CONT>
mystack<T, CONT>::mystack(const mystack<T, CONT> &rval):elem(rval.elem)
{
cout<<__func__<<endl;
}
template <class T, typename CONT>
mystack<T, CONT> & mystack<T, CONT>::operator=(const mystack<T, CONT> &rval)
{
cout<<__func__<<endl;
if (this==&rval) {
return *this;
}
this->elem=rval.elem;
return *this;
}
template <typename T, typename CONT>
mystack<T, CONT>::~mystack()
{
cout<<__func__<<endl;
}
template <typename T, typename CONT>
void mystack<T, CONT>::push(const T &elem)
{
cout<<__func__<<endl;
elem.push_back(elem);
}
template <typename T, typename CONT>
void mystack<T, CONT>::pop()
{
cout<<__func__<<endl;
try {
elem.pos_back();
}
catch (out_of_range){
cout<<"out_of_range"<<endl;
}
}
template <typename T, typename CONT>
T mystack<T, CONT>::top() const
{
cout<<__func__<<endl;
try {
return elem.back();
}
catch (out_of_range){
cout<<"out_of_range"<<endl;
}
}
上述程式碼就是mystack加了預設模板實參時候的程式碼,因為有兩個模板引數,所以,所以類外實現的成員函式必須也有兩個模板引數
使用帶有預設模板實參的類别範本時,如果不指定第二個引數,那麼第二個引數預設使用deque
int main(int argc, char const *argv[])
{
mystack<int> si;
si.push(10);
mystack<int, vector<int>> si2;
si2.push(20);
return 0;
}
參考
《C++ Template》
《C++ Primer》
歡迎大家評論交流,作者水平有限,如有錯誤,歡迎指出
相關文章
- 類别範本
- 類别範本與函式模板的區別函式
- 類别範本 單例模板單例
- c++函式模板和類别範本C++函式
- 類别範本與繼承繼承
- 類别範本與友元
- C++ 類别範本的寫法C++
- 陣列類别範本陣列
- C++ Templates (2.3 類别範本的區域性使用 Partial Usage of Class Templates)C++
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- 【C++】 59_類别範本深度剖析C++
- C++ 單例類别範本(詳解)C++單例
- 類别範本的常見用法
- c++11-17 模板核心知識(二)—— 類别範本C++
- pua 八股類别範本
- 【C++】 61_智慧指標類别範本C++指標
- 隱藏在 SDK 中的單例類别範本單例
- C++ Templates (2.1 類别範本Stack的實現 Implementation of Class Template Stack)C++
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- 類别範本中成員函式建立時機函式
- C++學習筆記 第59課類别範本深度刨析C++筆記
- 封裝不同類别範本的隨機數生成器封裝隨機
- 【演算法學習】數學專題 有理數類别範本演算法
- 類别範本及其成員函式的定義及注意事項函式
- VS2017 設定 類别範本引數推導(CTAD, Class Template Argument Deduction)
- 資料結構初階--單連結串列(講解+類别範本實現)資料結構
- 資料結構初階--棧和佇列(講解+類别範本實現)資料結構佇列
- 類别範本的簡單應用(用於儲存不同型別資料的類容器)型別
- 類别範本物件做函式引數物件函式
- 資料結構初階--雙向迴圈連結串列(講解+類别範本實現)資料結構
- 移動端UI設計規範模板參考以及設計規範的好處UI
- C++知識點49——類繼承與類的構造、拷貝、operator=和解構函式C++繼承函式
- Java™ 教程(區域性類)Java
- 區域性內部類
- 模板的偏特化,全特化
- IOS 底層原理 類的本質--(2)iOS
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- 專業領域的顯性知識與隱性知識