type_traits应用
生活随笔
收集整理的這篇文章主要介紹了
type_traits应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
工作遇到這樣的例子,對不同數據進行計算處理,得到一組結果集,包括計數、比例等。各個計算處理過程不同,結果集數據結構相同,但并非所有計算過程均有計數、比例的結果,有些可能只有計數,有些只有比例結果,而另外一些則計數、比例結果均有。
首先采用的方法是繼承,基類虛函數中實現,具體如下:
1 class CBase 2 { 3 public: 4 void GetResult() 5 { 6 GetCount(); 7 GetRatio(); 8 } 9 10 virtual void GetCount() 11 { 12 cout << "get base count;" << endl; 13 } 14 15 virtual void GetRatio() 16 { 17 cout << "get base ratio;" << endl; 18 } 19 }; 20 21 class CDrived1 : public CBase 22 { 23 public: 24 virtual void GetCount() 25 { 26 cout << "get drived1 count;" << endl; 27 } 28 29 virtual void GetRatio() 30 { 31 // 此必須實現為空,對于無比例結果; 32 } 33 }; 34 35 class CDrived2 : public CBase 36 { 37 public: 38 void GetCount() 39 { 40 cout << "get drived2 count;" << endl; 41 } 42 43 void GetRatio() 44 { 45 cout << "get drived2 ratio;" << endl; 46 } 47 }; 48 49 int main(int argc, char* argv[]) 50 { 51 CBase oB; 52 CDrived1 oD1; 53 CDrived2 oD2; 54 CBase *p = NULL; 55 p = &oB; 56 p->GetResult(); 57 p = &oD1; 58 p->GetResult(); 59 p = &oD2; 60 p->GetResult(); 61 return 0; 62 }輸出結果:
??????
滿足實際算法中的要求,但實際上由于各個算法實現具有較大差異,從同一基類繼承實現較為勉強,而且利用虛函數增加各個類之間的關聯性。
接觸到type_traits后,實現方法變更為如下代碼。
1 class CBase 2 { 3 public: 4 // void GetResult() 5 // { 6 // GetCount(); 7 // GetRatio(); 8 // } 9 10 void GetCount() 11 { 12 cout << "get base count;" << endl; 13 } 14 15 void GetRatio() 16 { 17 cout << "get base ratio;" << endl; 18 } 19 }; 20 21 class CDrived1 22 { 23 public: 24 virtual void GetCount() 25 { 26 cout << "get drived1 count;" << endl; 27 } 28 29 // virtual void GetRatio() 30 // { 31 // //cout << "get base ratio;" << endl; 32 // } 33 }; 34 35 class CDrived2 36 { 37 public: 38 void GetCount() 39 { 40 cout << "get drived2 count;" << endl; 41 } 42 43 void GetRatio() 44 { 45 cout << "get drived2 ratio;" << endl; 46 } 47 }; 48 49 // 50 struct _true_type {}; 51 struct _false_type {}; 52 53 template<typename T> 54 struct _type_traits 55 { 56 typedef _false_type has_count; 57 typedef _false_type has_ratio; 58 }; 59 60 template<> 61 struct _type_traits<CBase> 62 { 63 typedef _true_type has_count; 64 typedef _true_type has_ratio; 65 }; 66 67 template<> 68 struct _type_traits<CDrived1> 69 { 70 typedef _true_type has_count; 71 typedef _false_type has_ratio; 72 }; 73 74 template<> 75 struct _type_traits<CDrived2> 76 { 77 typedef _true_type has_count; 78 typedef _true_type has_ratio; 79 }; 80 81 template<typename _T> 82 void HelpResult(_T p) 83 { 84 typedef _type_traits<_T>::has_count COUNT; 85 _helpgetcount(p, COUNT()); 86 typedef _type_traits<_T>::has_ratio RATIO; 87 _helpgetratio(p, RATIO()); 88 } 89 90 template<typename _T> 91 void _helpgetcount(_T p, _true_type) 92 { 93 p.GetCount(); 94 } 95 96 template<typename _T> 97 void _helpgetcount(_T p, _false_type) 98 { 99 cout << "no count" <<endl; 100 } 101 102 template<typename _T> 103 void _helpgetratio(_T p, _true_type) 104 { 105 p.GetRatio(); 106 } 107 108 template<typename _T> 109 void _helpgetratio(_T p, _false_type) 110 { 111 cout << "no ratio" <<endl; 112 } 113 114 // 115 int main(int argc, char* argv[]) 116 { 117 CBase oB; 118 CDrived1 oD1; 119 CDrived2 oD2; 120 121 HelpResult<CBase>(oB); 122 HelpResult<CDrived1>(oD1); 123 HelpResult<CDrived2>(oD2); 124 return 0; 125 }輸出結果
更普遍的例子
http://www.cnitblog.com/weitom1982/archive/2008/12/19/7889.html
轉載于:https://www.cnblogs.com/gisdemo/p/3374734.html
總結
以上是生活随笔為你收集整理的type_traits应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# MVC的博客开发(二)登录
- 下一篇: 基于ssm的简单员工信息管理系统