在原模板的基礎上對特殊型別進行特殊化。分為函式模板特化和類模板特化。
特化步驟:
(前提要有乙個基礎的函式模板)
後加<> 2.函式名後加《指定type&> 3.形參表要和基礎型別一樣
//基礎模板
templatebool isequal(t& left, t& right)
void test1()
//特化
template<>
bool isequal(char*& left, char*& right)
1.分為全特化和偏特化
2.全特化:將模板引數類表中的引數型別都確定化。
templateclass data
private:
t1 _data1;
t2 _data2;
};template<>
class data
private:
char _data1;
int _data2;
};void test()
2.偏特化
1>部分引數特化
templateclass data
private:
t1 _data1;
t2 _data2;
};//第二個引數特化為int
templateclass data
private:
t1 _data1;
int _data2;
};
2>引數進一步限制:特化為指標,引用
//特化為指標
templateclass data
private:
t1 _data1;
t2 _data2;
};//特化為引用
templateclass data
private:
const t1& _data1;
const t2& _data2;
};
呼叫時如果該型別特化過,就優先呼叫特化的模板。
1.庫函式提供了memcpy函式實現拷貝:是淺拷貝,拷貝自定義型別可能出錯。
templatevoid copy(t* dst, const t& src, size_t size)
2.for迴圈乙個乙個拷貝:是深拷貝,但效率低。
templatevoid copy(t* dst, const t& src, size_t size)
}
3.多傳遞乙個引數ispod判斷是不是內建型別,是的話就用淺拷貝,否則用深拷貝。但是這個引數需要使用者手動傳入,可能出錯。
templatevoid copy(t* dst, const t& src, size_t size, bool ispod)
}
4.將所有內建型別全部列舉出來,通過typeid確定拷貝物件的實際型別,判斷是否為內建型別。要在內建型別中比較,效率低。
bool ispodtype(const char* strtype)
; for (size_t i = 0; i < sizeof(arrtype) / sizeof(arrtype[0]); i++) }
templatevoid copy(t* dst, const t& src, size_t size)
}
5.型別萃取:
//型別萃取:兩個類區分內建型別和自定義型別
struct truetype
};struct falsetype
};templatestruct typetraits
;template<>
struct typetraits;
template<>
struct typetraits;
template<>
struct typetraits;
template<>
struct typetraits;
template<>
struct typetraits;
templatestruct typetraits;
//......
templatevoid copy(t* dst, t* src, size_t size)
}void test5()
; int a2[5];
copy(a2, a1, 5);//程式執行使用特化的int,其中的ispod為truetype,get函式返回真,呼叫淺拷貝
string s1 = ;//string型別沒有特化,其中的ispod為falsetype,get函式返回假,呼叫賦值拷貝
string s2[3];
copy(s2, s1, 3);
}
C 模板特化和型別萃取
模板特化類似於函式過載,而且都是編譯鏈結時確定,而非執行時確定的 特化。specialize 就是讓模板引數t在某個具體型別時,可以特殊處理。特化的模板宣告,前面一般是template 要求函式對數值型別的引數比較大小,對string型別的引數,比較字串的長度 函式模板 template typen...
C 型別萃取及模板偏特化
1.型別萃取的作用 型別萃取使用模板技術來萃取型別 包含自定義型別和內建型別 的某些特性,用以判斷該型別是否含有某些特性,從而在泛型演算法中來對該型別進行特殊的處理用來提高效率或者其他。例如 在stl中的destory演算法根據函式的引數型別的特性 是否有trivial destructor來選擇對...
型別萃取 模板類的特化的應用
一 函式模板的特化 1 需要先有乙個模板函式 templatet max t left,t right 這種方式不能傳字串,需要進行特化 特化 char template max這個整體是函式的名字 char max char left,char right 二 模板類裡面的特化 1 全特化 把模板...