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

有如下题目:
假设有个计算类Calculator,它要处理int, long, float, double等数值类型。用模板实现GetLimit()方法,获得每种类型的数值的上限LIMIT,比如int的上限是100,long的上限是 1000,float的上限是999.99,double的上限是888.8888888等等。

在做这题之前,我对C++的traits一直不大理解,然后STL课程的老师也是讲得模棱两可,直到做这道题,体会到traits的好处才对traits有了深一步的了解,所以写文章记录一下。

当时看到这题目的时候,我就想,首先是才用模板的知识来解决这个问题,但是有一个问题,因为每种类型的数值的上限是不一样的,那么如何令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许多知识还没有学懂,需要时间好好琢磨琢磨。

你可能感兴趣的:(【GeekBand】C++面向对象高级编程-第八周笔记)