STL——萃取机制(Traits)
生活随笔
收集整理的這篇文章主要介紹了
STL——萃取机制(Traits)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我將從定義、技術實現、設問形式、實例總結來闡述我對于萃取機制的理解。
1.定義:traits中文意思是特性,它通過提取不同類的共性,使得可以統一處理。
2.技術實現:traits運用顯式模板特殊化將代碼中因為類型不同而發生變化的片段提取出來,用統一的接口來包裝,并通過traits模板類公開的接口間接訪問相應的類。
3.設問形式:
問題1:什么是顯式模板特殊化呢?
答:模板特殊化又分了一個偏特化(意思就是沒有完全的特化)我們來看一段代碼,
template<class T,class U>//基礎模板類 class NumTraits {}; //模板特化的格式 template<class T> //偏特殊化 class NumTraits<IntArray> { public:typedef int resulttype;typedef int inputargtype; }; template<class T> class NumTraits {}; //模板特化的格式 template<> //特殊化 class NumTraits<IntArray> { public:typedef int resulttype;typedef int inputargtype; };
?
問題2:用實例來展示一下為什么會使用萃取機制?
答:我會用(3步走)的代碼來解釋為什么需要使用萃取。
#include<iostream> using namespace std;//①基本類寫法 class IntArray { public:IntArray(){a = new int[10];for (int i = 0; i < 10; ++i){a[i] = i + 1;}}~IntArray(){delete[] a;}int GetSum(int times){int sum = 0;for (int i = 0; i < 10; ++i)sum += a[i];cout << "int sum=" << sum << endl;return sum * times;} private:int *a; }; class FloatArray { public:FloatArray(){f = new float[10];for (int i = 1; i <= 10; ++i){f[i - 1] = 1.0f / i;}}~FloatArray(){delete[] f;}float GetSum(float times){float sum = 0.0f;for (int i = 0; i < 10; i++)sum += f[i];cout << "float sum=" << sum << endl;return sum * times;} private:float* f; }; //②模板寫法 template<class T> class Apply { public:float GetSum(T& t, float inarg){return t.GetSum(inarg);} };//以上方法不能完全解決我們的問題(函數返回值固定,就會導致異常) //③采用萃取機制:模板特化 template<class T> class NumTraits {}; //模板特化的格式 template<> class NumTraits<IntArray> { public:typedef int resulttype;typedef int inputargtype; }; template<> class NumTraits<FloatArray> { public:typedef float resulttype;typedef float inputargtype; }; template<class T> class Apply2 { public:NumTraits<T>::resulttype GetSum(T& obj, NumTraits<T>::inputargtype inputarg){return obj.GetSum(inputarg);} }; int main() {IntArray intary;FloatArray floatary;Apply<IntArray> ai; //采用模板Apply<FloatArray> af; //采用模板cout << "1整型數組的和3倍:" << ai.GetSum(intary, 3) << endl;cout << "1浮點數組的和3.2倍:" << af.GetSum(floatary, 3.2f) << endl;cout<<endl;cout<<endl;Apply2<IntArray> ai2; //采用萃取Apply2<FloatArray> af2; //采用萃取cout << "2整型數組的和3倍:" <<ai2.GetSum(intary,3) << endl;cout << "2浮點數組的和3.2倍:" << af2.GetSum(floatary,3.2f) << endl;return 0; }
4.實例總結:
第①步:我們會發現代碼冗余度很高,所以采用了第二種;
第②步:我們會發現在運用模板后,代碼量是減少了,但是其類內部函數定義出現了固定形式的類型。若遇到復雜的問題,會導致數據的錯誤。
第③步:我們運用了traits機制,將根據不同類類型特化出相應的函數參數類型和返回值類型,這樣就可以通過統一的接口,來實現不同的實例。
由此,萃取機制對我們編碼的復用性,幫助還是很大的!!!!!!!
參考書籍:《C++STL基礎及應用》
轉載于:https://www.cnblogs.com/single-dont/p/11403807.html
總結
以上是生活随笔為你收集整理的STL——萃取机制(Traits)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下静态库和动态库的制作与使用
- 下一篇: inline函数