【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许多知识还没有学懂,需要时间好好琢磨琢磨。
推荐阅读
- 【个人成长】也谈“销售”
- 【我的小改变】认真对待早起这件小事
- 诡异bug|诡异bug 查找
- 从零开始学k8s|【云原生 | 从零开始学Kubernetes】八、命名空间资源配额以及标签
- 从零开始学k8s|【云原生 | 从零开始学Kubernetes】九、k8s的node节点选择器与node节点亲和性
- 打卡第3天
- 【Meetup预告】OpenMLDB+OneFlow(链接特征工程到模型训练,加速机器学习模型开发)
- 小程序|【微信小程序】小程序突破小程序二维码数量限制
- 实习周记-day2
- 等了56年,却等来了“吃屎”。