[GeekBand] STL Traits 使用简介
本文参考文献::GeekBand课堂内容,授课老师:张文杰
:C++ Templates 15章节
:网络资料: http://blog.csdn.net/my_business/article/details/7891687
1、定义:
函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时)。traits会是一种很好的解决方案。
助教提示:
1、不要像用switch一样枚举各个类型,用traits用模板实现。
2、第一是希望会使用traits表达类型信息,因为C++没有C#/Java中类似类型的判断,比如C#里有if (type is SomeType) { … },但C++没有。这个时候考虑用traits表达;第二,希望注意类似typename CalculatorTraits<T>::ReturnType的返回类型,不要觉得奇怪,是模板中常用的。
2、举例分析:
根据上面的提示,查阅了C++ Templates,进行如下的分析:
例一:(C++ Templates Page 240)
第一部分输出5个整数的平均值
第二部分输出字符的平均值
#include"accum1.h"
#include<iostream> int main()
{
int num[] = {,,,,};
//
cout<<"The average value of integer valus us"
<< accum(&num[],&num[])/; char name[] = " templates "
int length = sizeof(name) -; //
cout<<"the average value of the characters in \"
<<name <<'\n' is"
<<accum(&name[],&name[length])/length
<<'\n' ; }
由于我们是基于char类型进行实例化的,char类型范围很小,很容易出现越界的现象。所以我们要为该模板的所有用户创建而外的类型。
如下述,要使用这种方法才可以。
accum<int> (&name[],&name[length])
所有的正常点的用户都会抱怨这样的封装,因为用户不理解为什么要让他们去关心自己的模板类型是否越界,用户不明白为什么要自己定义输出类型呢?也不明白如何确定输出类型?
举例二:
template <typename T>
class Test {
......
};
Test中的某部分处理会随着类型T的不同而会有所不同,比如希望判断T是否为指针类型,当T为指针类型时的处理有别于非指针类型,怎么做?模板里再加个参数
template <typename T, bool isPointer>
class Test {
......// can use isPointer to judge whether T is a pointer
};
所有的正常点的用户都会抱怨这样的封装,因为用户不理解为什么要让他们去关心自己的模板类型是否为指针,既然是Test类本身的逻辑,为什么麻烦用户呢?
三、分析
解决的方法就是——使用每个模板的特化来写出这些关联代码
如习题中假设有个计算类Calculator,它要处理int, long, float, double等数值类型。
用模板实现GetLimit()方法,获得每种类型的数值的上限LIMIT,
比如int的上限是100,long的上限是 1000,float的上限是999.99,double的上限是888.8888888等等。
如果采用通用模板T,则不会因为输入类型不同而返回不同值。
template <typename T>
struct Calculator
{
public:
typename CalculatorHelper<T>::ret_type GetLimit()
{
return CalculatorHelper<T>::LIMIT;
};
private:
T mDate;
};
Calculator类中,新建一个结构体 Calculatorhelper 来特化所有出现的可能性。如果采用通用模板T,则不会因为输入类型不同而返回不同值。
#include "stdafx.h" //普通模板
template <typename T>
struct CalculatorHelper
{ }; //int 特例化,,直接返回LIMIT = 100
template <>
struct CalculatorHelper<int>
{
typedef int ret_type;
static ret_type LIMIT;
}; //long 特例化,直接返回LIMIT = 1000
template <>
struct CalculatorHelper<long>
{
typedef long ret_type;
static ret_type LIMIT;
}; //float 特例化,直接返回LIMIT = 999.99
template <>
struct CalculatorHelper<float>
{
typedef float ret_type;
static ret_type LIMIT;
}; //double 特例化,直接返回LIMIT = 888.8888888
template <>
struct CalculatorHelper<double>
{
typedef double ret_type;
static ret_type LIMIT;
}; CalculatorHelper<int>::ret_type CalculatorHelper<int>::LIMIT = ;
CalculatorHelper<long>::ret_type CalculatorHelper<long>::LIMIT = ;
CalculatorHelper<float>::ret_type CalculatorHelper<float>::LIMIT = 999.99;
CalculatorHelper<double>::ret_type CalculatorHelper<double>::LIMIT = 888.8888888;
int main()
{
//int
Calculator<int> TestInt;
cout << TestInt.GetLimit() << endl; //long
Calculator<long> TestLong;
cout << TestLong.GetLimit() << endl; //float
Calculator<float> TestFloat;
cout << TestFloat.GetLimit() << endl; //double
Calculator<double> TestDouble;
cout.precision();//确保7位显示
cout.setf(ios::fixed);
cout << TestDouble.GetLimit() << endl;
return ; }

通过上述分析:
我们把类型不同的int 、float、double、long,返回值不同。用户不必去关心具体的实现细节。只要输入一个类型的数据,就必然返回一个相应的数值。
总结:
函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时)。traits会是一种很好的解决方案。
上面仅仅是粗略的理解,还请各位朋友批评指正。
推荐进一步阅读资料:
http://blog.csdn.net/my_business/article/details/8098417
http://blog.csdn.net/zjq2008wd/article/details/41517367
[GeekBand] STL Traits 使用简介的更多相关文章
- [GeekBand] STL 仿函数入门详解
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格 http://www.leavesite. ...
- STL所有算法简介 (转) http://www.cnblogs.com/yuehui/archive/2012/06/19/2554300.html
STL所有算法简介 STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baid ...
- [GeekBand] STL vector 查找拷贝操作效率分析
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) :网络资料: 叶卡同学的部落格 http://www.leavesite.com/ htt ...
- [GeekBand] STL与泛型编程(1)
在C++语法的学习过程中,我们已经对模板有了基本的了解.泛型编程就是以模板为工具的.泛化的编程思想.本篇文章介绍了一些在之前的文章中没有涉及到的一些模板知识.泛型编程知识和几种容器.关于模板的一些重复 ...
- STL Traits编程技法
traits编程技法大量运用于STL实现中.通过它在一定程度上弥补了C++不是强型别语言的遗憾,增强了C++关于型别认证方面的能力. traits编程技法是利用“内嵌型别”的编程技法和编译器的temp ...
- [转贴]从零开始学C++之STL(一):STL六大组件简介
一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...
- STL六大组件简介
一.STL简介 (一).泛型程序设计 泛型编程(generic programming) 将程序写得尽可能通用 将算法从数据结构中抽象出来,成为通用的 C++的模板为泛型程序设计奠定了关键的基础 (二 ...
- [GeekBand] STL与泛型编程(2)
本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...
- STL——sort函数简介
参考:http://blog.csdn.net/s030501408/article/details/5329477 0)与C标准库qsort的比较:http://bbs.csdn.net/topic ...
随机推荐
- js取对象的属性值循环
var data = {name: "liuyang", job: "web", age: "27"} Object.keys(data). ...
- QQ群功能设计与心理学
刚刚在一个Java技术交流群,发了个 "博客投票"的广告. 群主两眼一黑,瞬间就把我给干掉了. 看到QQ给出的系统消息,发现QQ群的一个功能做得很不错. 大家注意到,右边有个&qu ...
- 【前端图表】echarts实现散点图x轴时间轴
话不多说,老规矩,先上图,实现echarts实现散点图,x轴数据为时间年月日. 实现代码如下: <!DOCTYPE html> <html> <head> < ...
- Tomcat redis 配置
http://www.cnblogs.com/interdrp/p/4868740.html http://blog.csdn.net/qq584852076/article/details/4650 ...
- HDU1969 Pie(二分搜索)
题目大意是要办生日Party,有n个馅饼,有f个朋友.接下来是n个馅饼的半径.然后是分馅饼了, 注意咯自己也要,大家都要一样大,形状没什么要求,但都要是一整块的那种,也就是说不能从两个饼中 各割一小块 ...
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
[199-Binary Tree Right Side View(从右边看二叉树] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 代码下载[https://github.co ...
- 浩爷AC自己主动机高速学习方案
今天弄完自己主动机之后.从那天比赛的阴影中爬出来了,猛地一看真不咋滴难,细致一看这尼玛还不如猛的一看. .. 必备算法:KMP,字典树(KMP我写了,字典树太简单,就是一个思想.我能够 ...
- php课程 11-37 类和对象的关系是什么
php课程 11-37 类和对象的关系是什么 一.总结 一句话总结:类生成对象,对象是类的实例化,一定是先有类,后有对象,一定是先有标准,再有个体. 1.oop的三大优势是什么? 重用性,灵活性.扩展 ...
- [转]C#连接操作mysql实例
本文转自:http://hi.baidu.com/zhqngweng/item/c4d2520cb7216877bfe97edf 第三方组件:Mysql.Data.dll说明:去官方网站下载Mysql ...
- angular 创建服务
一:新建服务模块和服务文件 ng g module services --spec=false ng g service services/quote --spec=false 二:在quote.se ...