【GeekBand】C++面向对象高级编程-第八周笔记

有如下题目:
假设有个计算类Calculator,它要处理int, long, float, double等数值类型。用模板实现GetLimit()方法,获得每种类型的数值的上限LIMIT,比如int的上限是100,long的上限是 1000,float的上限是999.99,double的上限是888.8888888等等。
在做这题之前,我对C++的traits一直不大理解,然后STL课程的老师也是讲得模棱两可,直到做这道题,体会到traits的好处才对traits有了深一步的了解,所以写文章记录一下。
【【GeekBand】C++面向对象高级编程-第八周笔记】当时看到这题目的时候,我就想,首先是才用模板的知识来解决这个问题,但是有一个问题,因为每种类型的数值的上限是不一样的,那么如何令GetLimit( )能够返回与类型相对应的LIMIT呢?也就是LIMIT是这个类型的一个特性。
特性然后就想到了traits。
这时候回过头来想,才明白traits的作用,简单来说,用来表示不同类型的特性。
既然明白了traits是什么和有什么作用,那么如何实现traits?
traits可以实现为模板类,这也很正常,用模板类可以进行针对不同类型的特化,从而实现不同的特性。通常这个模板类的命名为一般CLASSTraits。CLASS为使用到Traits的类的名称。
如果要特化一个类,那么做法是:
1.声明一个带template<>的类,即空参数列表。

template class CalculatorTraits {};

2.在类名称后面紧跟的尖括号中显式指明类型。
template< > class CalculatorTraits { public: typedef int ValueType; CalculatorTraits() : limit(100) { } ValueType getLimit( ) { return limit; } private: ValueType limit; }; template< > class CalculatorTraits { public: typedef long ValueType; CalculatorTraits() : limit(1000) { } ValueType getLimit( ) { return limit; } private: ValueType limit; }; template< > class CalculatorTraits { public: typedef float ValueType; CalculatorTraits() : limit(999.99) { } ValueType getLimit( ) { return limit; } private: ValueType limit; }; template< > class CalculatorTraits { public: typedef double ValueType; CalculatorTraits() : limit(888.8888888) { } ValueType getLimit( ) { return limit; } private: ValueType limit; };

好了,定义好相关的Traits,那么该如何使用呢?
template class Calculator { public: typedef CalculatorTraits CalTraits; //为后续书写方便 typedef typename CalTraits::ValueType ValueType; //为后续书写方便 ValueType GetLimit() { CalculatorTraits ct; //由于GetLimit是返回每个类型的上限,所以可以利用traits中存储了该类别的特性的特点 //即可实现题目要求。 return ct.getLimit(); } };

我脑海里想象的是trais相当于每个类型的信息卡,里面记录这这个类型的特性。
好了,STL课程到此位置,但感觉STL许多知识还没有学懂,需要时间好好琢磨琢磨。

    推荐阅读