說到型別萃取,必須先了解模板的特化。
在原模板類的基礎上,針對特殊型別所進行特殊化的實現方式。模板特化中分為函式模板特化類與類模板特化。
先建立乙個基礎的函式模板
關鍵字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...