日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++深度剖析教程38】类模板深度剖析

發布時間:2023/12/10 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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】类模板深度剖析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。