C++之类型萃取技巧
生活随笔
收集整理的這篇文章主要介紹了
C++之类型萃取技巧
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?
使用類型萃取的原因
就是當你的順序表是自定義類型,我們進行順序表增容的時候,這個時候會出現(xiàn)一個問題,比如string類型,這個類型中有一個_buf與_ptr,當儲存少于16個的時候這時會儲存在_buf當中的,如果多于16個,那個會單獨開辟空間,進行儲存,這時拷貝的時候就是拷貝過去這個儲存的地址而已,所以這樣調(diào)用析構(gòu)函數(shù)的時候,當增加容量的時候,這個時候會把儲存string的那塊空間進行釋放。會造成數(shù)據(jù)丟失的問題。
?
所以,在這里面我們提到一個類型萃取的技巧,可以把自定義類型和內(nèi)置類型的區(qū)分開,然后對自定義類型的使用for循環(huán)拷貝,對于內(nèi)置類型的,采用memcpy的方式進行拷貝
#include<iostream> #include<stdlib.h>using namespace std;//類型萃取 struct __truetype {bool get(){return true;} };struct __falsetype {bool get(){return false;}};template<typename T>struct typetraits {typedef __falsetype __ispodtype;};template<> struct typetraits<int > {typedef __truetype __ispodtype; };template<> struct typetraits<char > {typedef __truetype __ispodtype; };template<> struct typetraits<short > {typedef __truetype __ispodtype; };template<> struct typetraits<bool > {typedef __truetype __ispodtype; }; template<> struct typetraits<unsigned int > {typedef __truetype __ispodtype; }; template<> struct typetraits<unsigned short > {typedef __truetype __ispodtype; }; template<> struct typetraits<unsigned long > {typedef __truetype __ispodtype; }; template<> struct typetraits<long > {typedef __truetype __ispodtype; }; template<> struct typetraits<long long > {typedef __truetype __ispodtype; }; template<> struct typetraits<unsigned long long > {typedef __truetype __ispodtype; };template<> struct typetraits<long double > {typedef __truetype __ispodtype; }; template<> struct typetraits<double > {typedef __truetype __ispodtype; };template<> struct typetraits<float > {typedef __truetype __ispodtype; };template<typename T> void Copy(const T*src, T* dst, size_t size) {if (typetraits<T>::__ispodtype().get()){cout << "__truetype:" << typeid(T).name() << endl;memcpy(dst, src, size*sizeof(T));}else{cout << "__falsetype:" << typeid(T).name() << endl;for (size_t i = 0; i < size; i++){dst[i] = src[i];}}}void test() {int a1[8] = { 1, 2, 3, 4, 5, 6 };int a2[8] = { 9, 5, 6, 7, 8, 2, 2 };Copy(a1, a2, 3);cout << a2<<endl;string c1[10] = {"123","7989465","456321","4561","4563"};string c2[5] = {"654","312","a"};Copy(c1, c2, 3);} int main() {test();system("pause");return 0; }在這里我們采用了模板的特化,這里使用了全特化,直接給int,double等內(nèi)置類型做特化。
在這里我們設(shè)定內(nèi)置類型是truetype,設(shè)置自定義類型是falsetype,然后我們通過不同的類型利用get()函數(shù)返回不同的布爾值,這樣對內(nèi)置類型采用memcp拷貝,對于非內(nèi)置類型,采用for循環(huán)拷貝,這樣就能實現(xiàn)我們想要的結(jié)果了。
?
總結(jié)
以上是生活随笔為你收集整理的C++之类型萃取技巧的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++模板的那丢丢事儿
- 下一篇: s3c2440移植MQTT