• <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 發布時間:2020-09-28 23:33 原文鏈接: C++之類模板的深入學習總結

    一、類模板的深入學習:

    1、類模板可以定義任意多個不同的類型參數(這一點和模板函數一樣)

    template < typename T1, typenaem T2 >
    class Test

    public:
       void add(T1 a, T2 b);

    //定義類對象時
    Test

    2、類模板可以被特化

    指定類模板的特定實現

    部分類參數必須顯示指定

    根據類型參數分開實現類模板

    特化前:

    template < typename T1, typename T2 >
    class Test

     
    };

    特化后:

    template < typename T >
    class Test < T , T >

    };

    3、類模板的特化類型:

    部分特化:用特定的規則約束類型參數

    完全特化:完全顯示指定類型參數

    完全特化前:

    template

    完全特化后:

    template < >
    class Test < int, int>

    };

    代碼實踐:

    #include

    輸出結果:

    root@txp-virtual-machine:/home/txp# ./a.out
    void add(T1 a, T2 b)
    3.5
    void add(T a, T b)
    10
    class Test  < T , T >
    void add(void* a, void* b)
    error to add void* parm
    void add(T1* a, T2* b)
    1.1

    4、類模板特化注意事項:

    (1)特化只是模板的分開實現

    本質上是同一個類模板

    (2)特化類模板的使用方式是統一的

    必須顯示指定每一個類型參數

    5、類模板特化與重定義有區別嗎?函數模板可以特化嗎?

    (1)重定義和特化的不同:

    重定義:

    --一個類模板和一個新類(或者兩個類模板)

    --使用的時候需要考慮如何選擇的問題

    特化:

    --以統一的方式類使用類模板的特化類

    --編譯器自動優先選擇特化類

    (2)函數模板只支持參數完全特化

    函數模板特化前:

    template < typename T >
    bool Equal(T a, T b)

      return a==b;

    函數模板完全特化后:

    template < >
    bool Euqal

    代碼實踐:

    #include

    輸出結果:

    root@txp-virtual-machine:/home/txp# ./a.out
    bool Equal(T a, T b)
    1
    bool Equal

    注解:當需要重載函數模板時,優先考慮使用模板特化;當模板特化無法滿足需求,再使用函數重載

    二、總結:

    類模板可以定義任意多個不同的類型參數

    類模板可以被部分特化和完全特化

    特化的本質是模板的分開實現

    函數模板只支持完全特化

    工程中使用模板特化代替類(函數)重定義


  • <noscript id="yywya"><kbd id="yywya"></kbd></noscript>
  • 东京热 下载