我正在仔细阅读(MSVC ++ 2010)limits
标题以获取知识,并注意到这个小宝石:
template<class _Ty>
class numeric_limits
: public _Num_base
{
//...Insert min, max, lowest, epsilon,
//round_error, denorm_min, infinity, quiet_Nan, and signaling_Nan
//that return _Ty(0).
//In other words, this class does "nothing" in a "safe" manner.*
};
及时跟进:
template<class _Ty>
class numeric_limits<const _Ty>
: public numeric_limits<_Ty>
{ // numeric limits for const types
};
template<class _Ty>
class numeric_limits<volatile _Ty>
: public numeric_limits<_Ty>
{ // numeric limits for volatile types
};
template<class _Ty>
class numeric_limits<const volatile _Ty>
: public numeric_limits<_Ty>
{ // numeric limits for const volatile types
};
空课提供什么目的?为什么写呢?由于模板的特殊化以及传入常量,易失性或常量波动的非基本类型的可能性,我理解在这种情况下使用模板的目的;但是,在非模板使用的情况下,它提供了什么目的?
*“没有”和“安全”在这种情况下是主观的术语,并且只有当读者毫无疑问地知道他们真的什么都不做并且是安全的时候才能应用他们的外行定义。我没有,因此免责声明。
答案 0 :(得分:7)
标准要求numeric_limits<const int>
返回与numeric_limits<int>
相同的结果。标准库作者可以复制所有实现,也可以根据另一个实现定义。
空课提供什么目的?为什么写呢?
它不是一个空类,它具有与其基类相同的所有成员。这称为implementation inheritance。
有充分的理由来定义空类型,例如对于tag dispatching但是这里没有关系,因为那些numeric_limits
部分特化不管怎样都不会生成空类。
答案 1 :(得分:2)
我不确定这里有一个问题要回答。在你的问题中,你已经说过你理解为什么它在这种情况下 。听起来你要求我们解释为什么在其他一些实际上不存在的假设情况下会这样做。
为了知道为什么空类可能对其他一些情况有用,我想我们需要一个真正的例子,其中使用了一个空类。