C 中的特化問題和型別萃取問題

2021-08-19 22:45:24 字數 1578 閱讀 6544

型別萃取

從字面上來解釋,就是為已有的模板引數進行一些使其特殊化的指定,使得以前不受任何約束的模板引數,或受到特定的修飾(例如const或者搖身一變成為了指標,甚至是經過別的模板類包裝之後的模板型別)或完全被指定了下來。

就是模板中模板引數全被指定為確定的型別。全特化也就是定義了乙個全新的型別,全特化的類中的函式可以與模板類不一樣。

就是模板中的模板引數沒有被全部確定,需要編譯器在編譯時進行確定。

全特化的標誌就是產生出完全確定的東西,而不是還需要在編譯期間去搜尋適合的特化實現

模板類全特化

template

class keyval

;//全特化

template

<>

class keyval

;

這裡歸納下針對類模板特化的幾種型別

模板類的偏特化

template

class keyval

;template

//區域性特化

class keyval

;template

//區域性特化

class keyval;

從上面的例子可以看出區域性特化偏特化並不僅僅是指特化部分引數,而是針對模板引數更進一步的條件限制所設計出來的乙個特化版本。

模板函式全特化

template

void display(const t& x)

;struct __falsetype

{};template

struct typetraits

;template

t* __typecopy(const t* src,t* dst,size_t n,__truetype)

template

t* __typecopy(const t* src,t* dst,size_t n,__falsetype)

template

t* typecopy(const t* src,t* dst,size_t n)

template

<>

struct typetraits

;template

<>

struct typetraits

;template

<>

struct typetraits

;template

<>

struct typetraits

;

測試**:
void testtype()

; int dstint[5];

string srcstr[3]=;

string dststr[3]={};

typecopy(srcint,dstint,5);

typecopy(srcstr,dststr,3);

}

測試結果:

C 模板特化和型別萃取

模板特化類似於函式過載,而且都是編譯鏈結時確定,而非執行時確定的 特化。specialize 就是讓模板引數t在某個具體型別時,可以特殊處理。特化的模板宣告,前面一般是template 要求函式對數值型別的引數比較大小,對string型別的引數,比較字串的長度 函式模板 template typen...

C 模版全特化 偏特化 型別萃取

什麼是特化?沒有特化的c 模版中,不管傳入引數是什麼型別,都是一樣的處理方式。但是當我們需要針對某個特定的型別做特殊的處理的時候,這個時候就需要用到特化了。全特化 我們可以將某乙個類或某乙個函式單獨拿出來特化。舉個例子 template class t class vector private si...

分析C 型別萃取問題

一 什麼是型別萃取,它有什麼作用 1.型別萃取是實現不同型別資料面對同一函式實現不同的操作。2.增強 的復用性和可維護性。3.它與類封裝的區別是 並不用知道所呼叫的物件是什麼型別,型別萃取是編譯後知道型別,先實現 而類的封裝則是先定義型別,後實現方法。二 pod型別萃取 pod plain old ...