C 深度剖析教程38 類模板深度剖析

2021-08-19 13:44:54 字數 2048 閱讀 1797

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

類模板可以被特化:

類模板的特化型別:

看**:

#include 

#include

using

namespace

std;

template

< typename t1, typename t2 >

class test

};template

< typename t1, typename t2 >

class test < t1*, t2* > // 特化,關於指標的特化實現

};template

< typename t >

class test < t, t > // 特化 當 test 類模板的兩個型別引數完全相同時,使用這個實現

void print()

};template

< >

class test < void*, void* > // 完全特化,當 t1 == void* 並且 t2 == void* 時

};int main()

執行結果:

類模板特化注意事項:

特化,只是模板的分開實現

*本質上是同乙個類模板

特化後的模板使用方式是統一的

*必須顯示指定每乙個型別引數

問題:

1、類模板與重定義的區別?

2、函式模板可以特化麼?

重定義和特化的不同:

重定義

*重定義後,乙個是類模板,定以後的是乙個新類(即兩個類模板)

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

特化 *特化後的類與類模板是同乙個類,以統一的方式使用類模板和特化後的類

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

函式模板只支援型別引數完全特化:

看**:

#include 

#include

using

namespace

std;

/* 類模板 */

template

< typename t1, typename t2 >

class test

};/*

/* 類模板的完全特化 */

template

< >

class test < void*, void* > // 當 t1 == void* 並且 t2 == void* 時

};*/

class test_void

};/*函式模板*/

template

< typename t >

bool equal(t a, t b)

/* 引數型別完全特化的函式模板 */

template

< >

bool equal(double a, double b)

/* 正常函式,用於對比 */

bool equal(double a, double b)

int main()

注意:當需要過載函式模板時,優先考慮模板特化,當模板特化無法滿足要求時,再進行函式過載

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

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

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

函式模板只支援完全特化

工程中一般使用模板特化代替(函式)重定義

類模板深度剖析

多引數類模板 類模板可以定義任意多個不同的型別引數 template class test 使用上述的類模板 testt 類模板可以被特化 即特殊化 指定類模板的特定實現 部分型別引數必須顯示指定 根據型別引數分開實現類模板 template class test 上面的類模板可以被特化為 temp...

類模板深度剖析

類模板可以定義任意多個不同的型別引數 類模板可以被特化 指定類模板的特定實現 部分型別引數必須顯示指定 根據型別引數分開實現類模板 類模板的特化型別 部分特化 用特定規則約束型別引數 完全特化 完全顯示指定型別引數 類模板特化注意事項 特化只是模板的分開實現 本質上是同乙個類模板 特化類模板的使用方...

C 深度解析 48 類模板深度剖析

1.多引數類模板 2.程式設計實驗 include using namespace std 定義類模板 template 兩個不同引數。class test 下面類模板的特化,即引數型別為指標時的特殊情況 如何處理,下面是這種情況的類實現。因引數仍是泛型,故稱為部分特化 template class...