【C++深度剖析教程38】类模板深度剖析
生活随笔
收集整理的這篇文章主要介紹了
【C++深度剖析教程38】类模板深度剖析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
加qq1126137994 微信:liu1126137994 一起學(xué)習(xí)更多技術(shù)!!!
1、多參數(shù)類模板
類模板可以定義任意多個(gè)不同的類型參數(shù)
類模板可以被特化:
- 指定類模板的特定實(shí)現(xiàn)
- 部分類型參數(shù)必須顯示指定
- 根據(jù)類型參數(shù)分開(kāi)實(shí)現(xiàn)類模板
類模板的特化類型:
- 部分特化
*用特定規(guī)則約束類型參數(shù) - 完全特化
*完全顯示指定類型參數(shù)
看代碼:
#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* > // 特化,關(guān)于指針的特化實(shí)現(xiàn) { 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 > // 特化 當(dāng) Test 類模板的兩個(gè)類型參數(shù)完全相同時(shí),使用這個(gè)實(shí)現(xiàn) { 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* > // 完全特化,當(dāng) T1 == void* 并且 T2 == void* 時(shí) { public:void add(void* a, void* b){cout << "void add(void* a, void* b)" << endl;cout << "Error to add void* param..." << endl;} };int main() { /* 必須顯示的指定每一個(gè)參數(shù)的類型 */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; }運(yùn)行結(jié)果:
類模板特化注意事項(xiàng):
*本質(zhì)上是同一個(gè)類模板
*必須顯示指定每一個(gè)類型參數(shù)
2、特化的深度分析
問(wèn)題:
1、類模板與重定義的區(qū)別?
2、函數(shù)模板可以特化么?
重定義和特化的不同:
*重定義后,一個(gè)是類模板,定以后的是一個(gè)新類(即兩個(gè)類模板)
*使用的時(shí)候需要考慮如何選擇的問(wèn)題
*特化后的類與類模板是同一個(gè)類,以統(tǒng)一的方式使用類模板和特化后的類
*編譯器優(yōu)先自動(dòng)選擇特化類
函數(shù)模板只支持類型參數(shù)完全特化:
看代碼:
#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* > // 當(dāng) T1 == void* 并且 T2 == void* 時(shí) { 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;} };/*函數(shù)模板*/ template < typename T > bool Equal(T a, T b) {cout << "bool Equal(T a, T b)" << endl;return a == b; }/* 參數(shù)類型完全特化的函數(shù)模板 */ 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); }/* 正常函數(shù),用于對(duì)比 */ 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; }注意:當(dāng)需要重載函數(shù)模板時(shí),優(yōu)先考慮模板特化,當(dāng)模板特化無(wú)法滿足要求時(shí),再進(jìn)行函數(shù)重載
3、總結(jié)
總結(jié)
以上是生活随笔為你收集整理的【C++深度剖析教程38】类模板深度剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 有哪些好用的低代码开发平台?
- 下一篇: 【剑指offer - C++/Java】