C++學習筆記 第59課類别範本深度刨析
多引數類别範本
類别範本可以定義任意多個不同的型別引數,其中int對應t1,float對應t2
類别範本可以被特化
- 指定類别範本的特定實現
部分引數型別必須顯示指定
- 根據型別引數
分開實現類别範本
類别範本的特化型別
部分特化-用特定的規則約束型別引數
完全特化-完全顯示指定型別引數
59-1.cpp
#include <iostream>
using namespace std;
template
<typename T1,typename T2>
class Test
{
public:
void add(T1 a, T2 b)
{
cout << "void add(T1 a, T2 b)" << endl;
cout << a + b << endl;
}
};
template
<typename T>
class Test <T, T> //當Test類别範本的兩個型別引數完全相同時,呼叫這個模板,部分特化
{
public:
void add(T a, T b)
{
cout << "add(T a, T b)" << endl;
cout << a + b << endl;
}
};
template//完全特化,不需要型別宣告,如果T1,T2引數都為Void*的時候使用此實現
<>
class Test<void*, void*>
{
public:
void add(void* a, void* b)
{
cout << "add(void* a, void* b)" << endl;
cout <<"error on param"<< endl;
}
};
template
<typename T1, typename T2>
class Test<T1*, T2*>
{
public:
void add(T1* a, T2* b)
{
cout << "add(T1* a, T2* b)" << endl;
cout << *a + *b << endl;
}
};
int main()
{
Test<int, float> t1;
Test<int, int> t2;
Test<void*, void*>t3;
Test<int*, float*>t4;
int a = 10;
float b = 10.5;
t1.add(1,2);
t2.add(1,2);
t3.add(NULL, NULL);
t4.add(&a, &b);
return 0;
}
結果:
void add(T1 a, T2 b)
3
add(T a, T b)
3
add(void* a, void* b)
error on param
add(T1* a, T2* b)
20.5
類别範本的特化只是模板的分開實現,本質上只是同一個模板
,特化類别範本的使用方式是統一的,必須顯示指定每一個型別引數
2. 問題:
類别範本特化與重定義有什麼區別?函式模板可以特化嗎?有區別,有區別
3.特化的深度分析
重定義和特化的不同之處:
重定義:一個類别範本和一個新類(或者兩個模板)使用的時候需要考慮如何選擇的問題
特化:以統一的方式
使用類别範本和特化類,編譯器自動選擇特化類
,函式模板只支援引數完全特化,不支援部分特化
59-2.cpp 特化的深入理解
template
<typename T> //函式模板定義
bool Equal(T a,T b)
{
return a == b;
}
template //函式模板完全特化
<>
bool Equal<void*>(void *a,void* b)
{
return a == b
}
工程中的建議:當需要過載函式模板時,優先考慮模板特化
,當模板無法滿足時,再使用函式過載(兩個都存在時,編譯器預設選擇全域性的函式過載)
#include <iostream>
using namespace std;
//函式模板
template
<typename T>
bool equal(T a, T b)
{
const double delta = 1e-10;
double r = a - b;
cout << "bool Equal(T a, T b) " << endl;
return (-delta < r) && (r < delta);
}
//函式過載
bool equal(double a, double b)
{
const double delta = 1e-10;
double r = a - b;
cout << "bool equal(double a,double b)" << endl;
return (-delta < r) && (r < delta);
}
//函式模板完全特化
template
<>
bool equal<double>(double a, double b)
{
cout << "bool equal<double>(double a, double b)" << endl;
return a == b;
}
int main()
{
double a = 12.2222;
double b = 12.2222222;
cout << equal(a, b) << endl;//兩個的存在時,輸出bool equal(double a, double b)
//全域性過載不存在時,呼叫完全特化的函式模板
cout << equal<>(a, b) << endl;//呼叫函式特化
return 0;
}
小結
1.類别範本可以定義任意多個不同型別的引數
2.類别範本被部分特化和完全特化
3.特化的本質是模板的分開實現
4.函式模板只支援完全特化
5.工程中使用模板特化代替類(函式重定義)
相關文章
- 【C++】 59_類别範本深度剖析C++
- C++ 類别範本的寫法C++
- 類别範本
- c++函式模板和類别範本C++函式
- C++ 單例類别範本(詳解)C++單例
- 【C++】 61_智慧指標類别範本C++指標
- 陣列類别範本陣列
- C++知識點57——類别範本(2、類别範本的區域性特化與預設模板實參)C++
- 類别範本 單例模板單例
- 類别範本與繼承繼承
- 類别範本與友元
- 【演算法學習】數學專題 有理數類别範本演算法
- 類别範本的常見用法
- pua 八股類别範本
- C++ Templates (2.2 使用Stack類别範本 Use of Class Template Stack )C++
- 【深度學習】深度學習md筆記總結第1篇:深度學習課程,要求【附程式碼文件】深度學習筆記
- C++ Templates (2.1 類别範本Stack的實現 Implementation of Class Template Stack)C++
- 【C++ Primer Plus】學習筆記--第10章 物件和類C++筆記物件
- C++ Templates (2.3 類别範本的區域性使用 Partial Usage of Class Templates)C++
- 【C++ 泛型程式設計01:模板】函式模板與類别範本C++泛型程式設計函式
- 隱藏在 SDK 中的單例類别範本單例
- 類别範本與函式模板的區別函式
- 類别範本中成員函式建立時機函式
- c++11-17 模板核心知識(二)—— 類别範本C++
- Oracle高階培訓 第5課 學習筆記Oracle筆記
- Oracle高階培訓 第6課 學習筆記Oracle筆記
- Oracle高階培訓 第7課 學習筆記Oracle筆記
- Andrew NG 深度學習課程筆記:二元分類與 Logistic 迴歸深度學習筆記
- 《深度學習入門》第 2 章 感知機 筆記深度學習筆記
- C++類初學筆記C++筆記
- 封裝不同類别範本的隨機數生成器封裝隨機
- 吳恩達《神經網路與深度學習》課程筆記(1)– 深度學習概述吳恩達神經網路深度學習筆記
- C++學習筆記-----類和建構函式C++筆記函式
- 深度學習 筆記一深度學習筆記
- 深度學習keras筆記深度學習Keras筆記
- 深度學習框架Pytorch學習筆記深度學習框架PyTorch筆記
- lua課程學習筆記筆記
- C++學習筆記——003C++筆記