讨论

根据标准§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>::valuetrue,那么我们不需要检查is_floating_point<T>::value。我们保证后者是false

    这是一个图
    代表主要和复合类型特征(此图顶部的叶子是主要类别)。

    http://howardhinnant.github.io/TypeHiearchy.pdf

    如果允许(例如)对std::complex<double>is_classis_floating_point回答为true,则此有用的不变式将被破坏。程序员将不再能够依靠以下事实:如果是is_floating_point<T>::value == true,那么T必须是floatdoublelong double之一。

    现在有一些特征,标准会“拒绝”,允许用户定义类型的专门化。 common_type<T, U>是这样的特征。

    对于主要和复合类型的性状,没有计划放宽对这些性状进行专门化的限制。这样做会损害这些特性对C++可以生成的每个单个类型进行精确而唯一的分类的能力。

    10-08 11:28