工作遇到这样的例子,对不同数据进行计算处理,得到一组结果集,包括计数、比例等。各个计算处理过程不同,结果集数据结构相同,但并非所有计算过程均有计数、比例的结果,有些可能只有计数,有些只有比例结果,而另外一些则计数、比例结果均有。
首先采用的方法是继承,基类虚函数中实现,具体如下:
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