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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值