【C++深度剖析教程38】类模板深度剖析
生活随笔
收集整理的這篇文章主要介紹了
【C++深度剖析教程38】类模板深度剖析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
加qq1126137994 微信:liu1126137994 一起學習更多技術!!!
1、多參數類模板
類模板可以定義任意多個不同的類型參數
類模板可以被特化:
- 指定類模板的特定實現
- 部分類型參數必須顯示指定
- 根據類型參數分開實現類模板
類模板的特化類型:
- 部分特化
*用特定規則約束類型參數 - 完全特化
*完全顯示指定類型參數
看代碼:
#include <iostream> #include <string>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 T1, typename T2 > class Test < T1*, T2* > // 特化,關于指針的特化實現 { 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 << "void add(T a, T b)" << endl;cout << a + b << endl;}void print(){cout << "class Test < T, T >" << endl;} };template < > class Test < void*, void* > // 完全特化,當 T1 == void* 并且 T2 == void* 時 { public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;} };int main() { /* 必須顯示的指定每一個參數的類型 */Test<int, float> t1;Test<long, long> t2;Test<void*, void*> t3;t1.add(1, 2.5);t2.add(5, 5);t2.print();t3.add(NULL, NULL);Test<int*, double*> t4;int a = 1;double b = 0.1;t4.add(&a, &b);return 0; }運行結果:
類模板特化注意事項:
*本質上是同一個類模板
*必須顯示指定每一個類型參數
2、特化的深度分析
問題:
1、類模板與重定義的區別?
2、函數模板可以特化么?
重定義和特化的不同:
*重定義后,一個是類模板,定以后的是一個新類(即兩個類模板)
*使用的時候需要考慮如何選擇的問題
*特化后的類與類模板是同一個類,以統一的方式使用類模板和特化后的類
*編譯器優先自動選擇特化類
函數模板只支持類型參數完全特化:
看代碼:
#include <iostream> #include <string>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 < > class Test < void*, void* > // 當 T1 == void* 并且 T2 == void* 時 { public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;} }; */class Test_Void { public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;} };/*函數模板*/ template < typename T > bool Equal(T a, T b) {cout << "bool Equal(T a, T b)" << endl;return a == b; }/* 參數類型完全特化的函數模板 */ template < > bool Equal<double>(double a, double b) {const double delta = 0.00000000000001;double r = a - b;cout << "bool Equal<double>(double a, double b)" << endl;return (-delta < r) && (r < delta); }/* 正常函數,用于對比 */ bool Equal(double a, double b) {const double delta = 0.00000000000001;double r = a - b;cout << "bool Equal(double a, double b)" << endl;return (-delta < r) && (r < delta); }int main() { cout << Equal( 1, 1 ) << endl;cout << Equal<>( 0.001, 0.001 ) << endl;return 0; }注意:當需要重載函數模板時,優先考慮模板特化,當模板特化無法滿足要求時,再進行函數重載
3、總結
總結
以上是生活随笔為你收集整理的【C++深度剖析教程38】类模板深度剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有哪些好用的低代码开发平台?
- 下一篇: 【剑指offer - C++/Java】