C 型別萃取

2021-09-24 17:21:36 字數 1641 閱讀 4346

說到型別萃取,必須先了解模板的特化。

在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函式模板特化類與類模板特化。

先建立乙個基礎的函式模板

關鍵字template後面接<>,尖括號裡面為空。

函式名後跟一對尖括號,尖括號中指定需要特化的型別。

函式形參表:必須要和模板函式的基礎引數型別完全相同。

類模板的特化又分為全特化和偏特化。

全特化:將模板引數類表中所有的引數都確定。

templateclass data

private:

t1 _d1;

t2 _d2;

};template<>

class data

private:

t1 _d1;

t2 _d2;

};void testvector()

偏特化:任何針對模板引數進一步進行條件限制設計的特化版本。

偏特化有以下兩種表現方式:

部分特化:將模板引數類表中的一部分引數特化。

template class data

private:

t1 _d1;

int _d2;

};

引數更進一步的限制:偏特化並不僅僅是指特化部分引數,而是針對模板引數更進一步的條件限制所設計出來的乙個特化版本。

//兩個引數偏特化為指標型別

template class data

private:

t1 _d1;

t2 _d2;

};//兩個引數偏特化為引用型別

template class data

private:

const t1& _d1;

const t2& _d2;

};

模板編譯過程

檢查函式模板是否有語法錯誤(簡單檢測)。

檢測對函式模板的例項化,編譯器根據推演實參型別結合函式模板生成實際**。

//內建型別

struct truetype

};//自定義型別

struct falsetype

};//使用者按照任意型別例項化該模板

templatestruct typetraits

;//內建型別

template<>

struct typetraits;

//省略其它內建型別的特化...

/*t為int:typetraits已經特化過,程式執行時就會使用已經特化過的typetraits,該類中的ispodtype為類truetype,而truetype中get()函式返回true。

t為自定義型別data:typetraits沒有特化過,程式執行時使用typetraits類模板,該類模板中的ispodtype為類falsetype,而falsetype中get函式返回true。

*/if (typetraits::ispodtype::get())

else

C 型別萃取

在c 中我們可以通過typeid來獲取乙個型別的名稱 內建型別和自定義型別都可以 但是我們不能用這種方式獲取來的名稱做變數的宣告。那麼在c 中怎樣識別物件的型別呢?我們可以通過型別萃取的方式來區分內建型別和自定義型別。例如 我們在seqlist中要用到型別萃取,因為內建型別我們可以通過memcopy...

C 型別萃取

當我們遇到這樣的場景時,我們會用到型別萃取 template void copy t dst,t str,size t n 模板函式copy void test string s2 10 int l1 10 int l2 10 copy s1,s2,10 copy l1,l2,10 for size...

C 型別萃取

型別萃取依靠的就是模版的特化,模版的特化又分為全特化和偏特化,根據不同的情況做相應的呼叫。函式模版特化 函式模版只有全特化,而沒有偏特化。沒有偏特化的原因是已經有了函式過載。通用模版並不總是正確的,在某些情況下有可能是錯誤的。例如 include using namespace std templa...