Is_integral vs is_integer:是冗余的

is_integral vs is_integer: is one of them redundant?

本文关键字:冗余 is integral vs Is integer      更新时间:2023-10-16

is_integral和is_integer似乎以相同的方式回答

从相关文档页面的链接来看,is_integral似乎缺少以下类型的专门化

signed char       
unsigned char     
unsigned short    
unsigned int      
unsigned long     
unsigned long long

然而,一个编译的例子,当然也显示了它们在这些类型上的相同行为:

#include <iostream>
#include <type_traits>
using namespace std;
int main() 
{
    cout << is_integral<signed char       >::value << endl;
    cout << is_integral<unsigned char     >::value << endl;
    cout << is_integral<unsigned short    >::value << endl;
    cout << is_integral<unsigned int      >::value << endl;
    cout << is_integral<unsigned long     >::value << endl; 
    cout << is_integral<unsigned long long>::value << endl;
    return 0;
}

所以如果它们的行为也相同,那么在c++ 11中引入它们的意义是什么呢?

如果它们的行为相同,那么在c++11中引入它们的意义何在?

编辑:重述

正如Useless所指出的,短语包括is_integral文档页中的任何有符号的、无符号的和cv限定的变体表明它们的规范是完全匹配的。

std::numeric_limits<T>::is_integer是c++ 11引入的而不是。它刚刚更新为使用新的constexpr限定符。

std::is_integral<T>是c++ 11引入的,你是对的,它给出了相同的结果。至于为什么要添加它——可能是因为类型的完整性或其他方面在逻辑上不是该类型的numeric_limits的一部分?

似乎<type_traits>头文件的目标是在一个地方收集所有类型分类帮助器,而旧的numeric_limits只收集特定于数字的属性。如果numeric_limits<T>::is_integer被弃用,那么在<type_traits>中存在哪些类型特征,哪些类型特征被认为是数字的,就会有一个稍微任意的边界。在两个地方都有,这并不是一个可怕的重复。

Noone提到std::is_integral遵循与其他c++ 11 UnaryTypeTraits相同的风格,即定义一个名为value的静态数据成员。这使得它可以在需要一元类型trait的地方互换使用,例如:

template<typename Cond1, typename Cond2>
  using And = integral_constant<bool, Cond1::value && Cond2::value>;

你不能以同样的方式使用std::numeric_limits::is_integer,因为它不遵循与c++ 11特征相同的约定。

将每个trait拆分为具有一致名称的单个类型,使它们比将多个属性捆绑在一起并使用不可预测的名称的trait更灵活。

两者是相同的,并且将提供相同的输出。

但是std::numeric_limits<T>::is_integer从C98开始就存在了,而不是c++ 11,而std::is_integral是作为c++ 11类型trait的一部分引入的(<type_traits>头文件)

编辑:

正如@Useless提到的,引入std::is_integral的原因可能是希望重新组合<type_traits>中的所有特征。

这是将is_integral添加到c++ 0x的原始提案。

他们没有提到与std::numeric_limits<>::is_integer的重叠,但我假设他们的愿望只是将所有类型特征放在一个明显的地方。