讨论
根据标准§20.10.2/1 header <type_traits>
提要[meta.type.synop]:
这个特定的条款与STL应该是可扩展的一般概念相矛盾,并阻止我们扩展类型特征,如以下示例所示:
namespace std {
template< class T >
struct is_floating_point<std::complex<T>> : std::integral_constant
<
bool,
std::is_same<float, typename std::remove_cv<T>::type>::value ||
std::is_same<double, typename std::remove_cv<T>::type>::value ||
std::is_same<long double, typename std::remove_cv<T>::type>::value
> {};
}
其中
std::is_floating_point
扩展为也处理具有基础浮点类型的complex
号。问题
最佳答案
对于主要类型类别(is_floating_point
是其中一种),存在一个设计不变式:
引用:(20.10.4.1主要类型类别[meta.unary.cat])
程序员在检查一些未知的通用类型T
时可以依靠通用代码中的该不变式:如果is_class<T>::value
是true
,那么我们不需要检查is_floating_point<T>::value
。我们保证后者是false
。
这是一个图
代表主要和复合类型特征(此图顶部的叶子是主要类别)。
http://howardhinnant.github.io/TypeHiearchy.pdf
如果允许(例如)对std::complex<double>
和is_class
的is_floating_point
回答为true,则此有用的不变式将被破坏。程序员将不再能够依靠以下事实:如果是is_floating_point<T>::value == true
,那么T
必须是float
,double
或long double
之一。
现在有一些特征,标准会“拒绝”,允许用户定义类型的专门化。 common_type<T, U>
是这样的特征。
对于主要和复合类型的性状,没有计划放宽对这些性状进行专门化的限制。这样做会损害这些特性对C++可以生成的每个单个类型进行精确而唯一的分类的能力。