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,一经查实,立即删除!

相关文章

那些不能错过的XCode插件

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

用JSLint精炼提升JavaScript代码

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

网页选项卡的应用

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

工欲善其事必先利其器系列之:在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…

scrapy框架-post使用

scrapy中使用FormRequest向网页提交数据 Scrapy post使用 如何post data&#xff1a; http://httpbin.org/post FormRequest : post请求 GitHub Login 借助浏览器分析登陆行为。 分析post的内容先尝试一次错误的登陆&#xff1a;如下&#xff1a;分析&#xff1a;需要post…

Oracle行列转换小结

目录结构如下&#xff1a;行转列列转行[一]、行转列 1.1、初始测试数据 表结构&#xff1a;TEST_TB_GRADE Sql代码 create table TEST_TB_GRADE ( ID NUMBER(10) not null, USER_NAME VARCHAR2(20 CHAR), COURSE VARCHAR2(20 CHAR), SCORE FLOAT ) 初始…

python- 进阶 与flask的搭配使用---定时任务框架APScheduler学习详解

APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动&#xff0c;例如项目中有一个定时统计程序&#xff0c;定时爬出网站的URL程序&#xff0c;定时检测钓鱼网站的程序等等&#xff0c;都涉及到了关于定时任务的问题&#xff0c;第一时间想到的是利用ti…

Mingw下g++编译执行顺序错误

今天写一个简单的线性表时&#xff0c;用Mingw中的g编译、调试、运行时发现一个奇怪的现象&#xff1a;程序的执行顺序与实际编写顺序不一致。 编译环境&#xff1a;代码编写 win7下 editplus Mingw 4.3.3 g 代码片段如下&#xff1a; 1 //function: create a list 2 //ti…

HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)

上一篇文章中介绍了实验的准备工作&#xff0c; HDTV&#xff08;1920x1080&#xff09;码率和视频质量关系的研究 1 &#xff08;前期准备&#xff09; 本文介绍一下实验的结果。 首先来看一下主观评价的试验结果&#xff1a; 从实验结果来看&#xff0c;可以得出以下结论&…

NGUI如何创建自己的精灵图集

说实话其实很简单,但是在不知道的情况下真的不好弄啊. 1. 选择你要制作精灵图集的图片,可以选择多张 2. 提倡使用快捷键Alt Shift M 会有如下窗口弹出,也可以NGUI --> Open-->Atlas Maker打开 我们看到在Sprites里面就是我们选择的要制作图集的图片 当在Replace后面的输…

VMware虚拟机与宿主无法复制的解决办法

由于工作需要&#xff0c;上网机器使用虚拟机&#xff0c;因此需要经常来回的拷贝文件&#xff0c;而vmware从6.5一直走来到10.0.1&#xff0c;总是有一个问题很让人苦恼---共享粘贴板总是会无故失效。经常实验&#xff0c;发现可以经过以下方法临时解决一下&#xff0c;虽然不…

我感觉我恰似一个呆逼

TicTacToe V2.0。 非要用1-9来输入的结果就是使用二维数组这件事的意义变得非常难找。 留个遗体&#xff0c;我要改回坐标输入了。 1 public class Game {2 String chessBoard;3 String[][] pieces new String[3][3];4 5 /** 初始化棋盘样式和棋子数组。*/6 …

[企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用

1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决,并版&#xff0c;tags 3. 数据库安装 4. 邮件服务器搭建 5. JIRA环境搭建和使用 6. CC.NET项目持续发布工具…

关于 mysql.test 数据库

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…

Python中strip()、lstrip()、rstrip()用法详解

Python中strip()、lstrip()、rstrip()用法详解 Python中有三个去除头尾字符、空白符的函数&#xff0c;它们依次为: strip&#xff1a; 用来去除头尾字符、空白符(包括\n、\r、\t、 &#xff0c;即&#xff1a;换行、回车、制表符、空格) lstrip&#xff1a;用来去除开头字符、…

HDU 4121 Xiangqi 模拟题

题目&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid4121 首先对标题赞一个&#xff0c;非要叫 “Xiangqi” 而不是 ”中国象棋“ 或者 ”Chinese chess“ 。。 然后是题意&#xff1a;黑棋只剩下一个”将“了&#xff0c;红棋各种 ”车” “马” “炮“&#xff0c;…

Python3的方法解析顺序(MRO)

Python 2.3 的新式类的 C3 算法。它也是 Python 3 唯一支持的方式(笔者使用python3&#xff0c;所以就先讲这种的) 一个例子&#xff1a; class D(object): pass class E(object): pass class F(object): pass class C(D, F): pass class B(E, D): …

WPF 用 DataTemplate 合并DataGrid列表列头类似报表设计及行头列头样式 - 学习

WPF中 DataGrid 列头合并&#xff0c;类似于报表设计。效果图如下↓ 1.新建一个WPF项目WpfApplication1&#xff0c;新建一个窗体DataGridTest&#xff0c;前台代码如下&#xff1a; <Window x:Class"WpfApplication1.DataGridTest" xmlns"http://sch…