剛剛我們接觸過模板類,類似於這樣的:
在這個類中,我們如何知道它是什麼型別的呢?這裡,我們可以在類中加入乙個內嵌型別,如:
這樣就可以知道它是使用者自定義的還是本身型別就擁有的,我們用到了型別萃取的方式。我們把__ispodtype叫做內嵌型別。
當我們遇到其他型別時,就將__ispodtype定義為__falsetype;
當遇到自定義型別時,就將
__ispodtype定義為__truetype;
說起這種書寫方式,將template<>稱為型別的特化。
舉乙個實在點的例子吧
#includeusing namespace std;
struct __truetype
};struct __falsetype
};templatestruct typetraits
;template<>
struct typetraits//在這裡,非自定義型別只列出了int,char,float等這幾種,其實還有很多態別,像long long,double,unsigned char等等
;template<>
struct typetraits;
template<>
struct typetraits;
template<>
struct typetraits;
template<>
struct typetraits;
templatevoid copy(const __tp* src, __tp* dst,size_t size,__truetype)
templatevoid copy(const __tp* src, __tp* dst,size_t size,__falsetype)
}
// 使用萃取判斷型別的get函式判斷是否是 pod型別來處理
//template//void copy(const __tp* src, __tp* dst,size_t size) //copy的另外一種寫法,不傳入型別
//// else
// // }
//}templatevoid print(const __tp* arr,size_t size)
以上是陣列的拷貝,用了型別萃取的方式。詳細一點說型別萃取技術的由來就是,由於c++模板中類的引數是抽象的,我們不能在模板類中直接獲得它的具體特徵,我們就用型別萃取(trait)的方式,來抽取型別的具體特徵,知道它是什麼型別,比如內建型別,自定義型別。
我們可以看到很多模板類的特化,這也是型別萃取的乙個基本思想。
模板之型別萃取
函式類模板萃取主要針對的是含有自定義型別的函式 我們的型別函式如果需要拷貝往往可以通過給定庫函式經行萃取,但是尼?我們的型別函式型別中每乙個變數中含有的成員個數都是不知道的,我們就需要另外一種拷貝深拷貝的方式,對我們的自定義型別經行處理。好了,我們定義一種不需要傳遞第三引數的方法型別萃取一下。定義自...
拷貝函式之型別萃取
經常在寫模板順序表的時候遇到乙個問題,在拷貝元素的時候應該用for迴圈進行賦值,還是應用效率較高的memcpy.今天我們就來討論一下。首先看下它們各自的優缺點 1 for 迴圈拷貝比較安全,容易想到並且實現 但是在順序表元素太多時,時間複雜度高的情況下,for迴圈拷貝的效率比較低。2 memcpy是...
C 型別萃取
在c 中我們可以通過typeid來獲取乙個型別的名稱 內建型別和自定義型別都可以 但是我們不能用這種方式獲取來的名稱做變數的宣告。那麼在c 中怎樣識別物件的型別呢?我們可以通過型別萃取的方式來區分內建型別和自定義型別。例如 我們在seqlist中要用到型別萃取,因為內建型別我們可以通過memcopy...