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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273976.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

csv.writer写入文件有多余的空行

在用csv.writer写入文件的时候发现中间有多余的空行。 最早打开方式只是‘w’&#xff0c;会出现多余的空行&#xff0c;网上建议使用binary形式‘wb’打开可以解决问题&#xff1a; with open(egg2.csv, wb) as cf:12 不过只能在python2下运行&#xff0c;python3报错&#xf…

java笔记之连接数据库

1、一定不要忘了导入包 java工程&#xff1a;lib文件夹下mysql-connector-java.jar--->Build Path Web工程:当web下的servlet需要连接数据库时&#xff0c;除了上一步导入包还要在WEB-INF/lib导入mysql-connector-java.jar 2、关于乱码&#xff0c;查询 在终端查询数据时&am…

那些不能错过的XCode插件

XCode颜色显示插件ColorSense代码里的那些冷冰冰的颜色数值&#xff0c;到底时什么颜色&#xff1f;如果你经常遇到这个问题&#xff0c;每每不得不运行下模拟器去看看&#xff0c;那么这个插件绝对不容错过。更彪悍的是你甚至可以点击显示的颜色面板&#xff0c;直接通过系统的…

python爬虫第一课 开发环境配置

一、Python3的安装 二、请求库的安装 1、requests的安装 直接pip安装&#xff1a;pip3 install requests 2、Selenium的安装 selenium是一个自动测试化工具&#xff0c;利用它我们可以驱动浏览器执行特定的动作&#xff0c;如点击、下拉等操作。 直接pip安装&#xff1a;pip in…

用JSLint精炼提升JavaScript代码

由于移动应用的盛行和HTML5的广泛运用&#xff0c;JavaScript正越来越流行。JavaScript受欢迎的部分原因是因为它的灵活便捷&#xff0c;你可以快速上手&#xff0c;它不需要重量级的开发环境&#xff0c;也不需要第三方应用支持&#xff0c;只要你打开一个文本编辑器&#xff…

pymssql出现的错误

安装pymssql出现的错误&#xff1a;如下&#xff1a;---------------------------------------- Failed building wheel for pymssqlRunning setup.py clean for pymssql Failed to build pymssql Installing collected packages: pymssqlRunning setup.py install for pymssq…

javascript设计思维

//一.把参数当作私有变量使用 (function (a, b) {//把参数当作私有变量使用&#xff0c;省略了var&#xff0c;也节省了行数console.log(b) //undefined&#xff0c;所有未赋值的变量均为undefined })(window);//二.把参数作为参数使用 var obj_init function (b, d, f) {//1…

linux第一章简答

linux第一章简答题&#xff1a; 1、你在你的主机上面安装了一张网卡&#xff0c;但是开机之后&#xff0c;系统却无法使用&#xff0c;你确定网卡是好的&#xff0c;那么可能的问题出在哪里&#xff1f;该如何解决&#xff1f; 答&#xff1a;因为所有的硬件都没有问题&#xf…

(原创)一个和c#中LazyT类似的c++ LazyT类的实现

在.net 4.0中增加一个延迟加载类Lazy<T>&#xff0c;它的作用是实现按需延迟加载&#xff0c;也许很多人用过。一个典型的应用场景是这样的&#xff1a;当初始化某个对象时&#xff0c;该对象引用了一个大对象&#xff0c;需要创建&#xff0c;这个对象的创建时需要较长的…

网页选项卡的应用

&#xff08;1&#xff09;功能描述&#xff1a; 在页面中&#xff0c;设置三个不同名称的选项卡&#xff0c;当单机某个选项卡时&#xff0c;下面相对应的区域显示其内容信息&#xff0c;同时选项卡的背景色与内容信息的背景色浑然一体&#xff0c;并且字体加粗&#xff0c;表…

python 爬虫-beautifulsoup4

利用它可以不用编写正则表达式即可方便的实现网页信息的提取。 pip3 install beautifulsoup4 用法讲解&#xff1a;常用解析库&#xff1a; lxml HTML解析器 lxml XML解析器 from bs4 import BeautifulSoup soup BeautifulSoup(html,lxml) print(soup.prettify()) #格式化代…

魔兽控制命令ID

来源:http://tieba.baidu.com/p/1084211586本次技能ID大全共收录ID368条不包括重复的ID&#xff0c;物品类技能的ID使用必须将物品技能单独抽离出来并设置“物品技能false”&#xff0c;拥有命令字符串的物品请参考拥有相同字符串的4族中立技能。P.S所有ID都是按照从小到大的顺…

python爬虫框架--scrapy 基本使用

流程框架&#xff1a; 1、抓取第一页&#xff1a;请求第一页的URL并得到源代码&#xff0c;进行下一步分析。 2、获取内容和下一页链接&#xff1a;分析源代码&#xff0c;提取首页内容&#xff0c;获取下一页链接等待进一步爬取。 3、保存爬取结果&#xff1a;将爬取结果保存为…

jsp页面的使用

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//1.获取资源文件 InputStream isthis.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties"); Str…

python爬虫安装错误与解决方式

# 安装错误&#xff1a; error:Microsoft Visual C 14.0 is required... 下载地址&#xff1a;http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted pip install xxx.whl # 运行错误 1&#xff1a; from .. Import etree ImportError:DLL load failed pip uninstall lx…

工欲善其事必先利其器系列之:在VS里面折叠js代码

之前用vs写js的时候经常因为js代码过长而且不能像cs文件里面的方法一样进行折叠而抓狂,直到在扩展库发现了这款插件有了它就可以把代码进行折叠了 插件地址转载于:https://www.cnblogs.com/Chendaqian/p/3396702.html

python- 基础 map方法

python中map()函数 map()是 Python 内置的高阶函数&#xff0c;它接收一个函数 f 和一个 list&#xff0c;并通过把函数 f 依次作用在 list 的每个元素上&#xff0c;得到一个新的 list 并返回。 例如&#xff0c;对于list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每个…

C算法编程题(二)正螺旋

前言 上一篇《C算法编程题&#xff08;一&#xff09;扑克牌发牌》 写东西前总是喜欢吐槽一些东西&#xff0c;还是多啰嗦几句吧&#xff0c;早上看了一篇博文《谈谈外企涨工资那些事》&#xff0c;里面楼主讲到外企公司包含的五类人&#xff0c;其实不只是外企如此&#xff0c…

同时获取同一等级下多个class值的节点的方法

方法&#xff1a; tr_ soup.find("div", class_"mod_cont fcolor30").find_all("tr", attrs{"class":["md_tr font14 bgcolor-s","md_tr font14 bgcolor"]}) 同时获取两个不同的class.例如&#xff1a; 当Beauti…

【循序渐进学Python】6.Python中的函数

1. 创建函数 一个函数代表一个行为并且返回一个结果(包括None)&#xff0c;在Python中使用def关键字来定义一个函数&#xff0c;如下&#xff1a; def hello(name):print hello, name ! 接下来调用函数&#xff0c;并查看其返回值&#xff1a; # output: # hello,gy! # None …