is_integral vs is_integer:其中一个是多余的?

时间:2014-05-31 13:12:54

标签: c++ c++11 stl

is_integralis_integer似乎以同样的方式回答相同的事情

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

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

然而compiled example显示(当然)他们在这些类型上的相同行为:

#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 doc页面的短语包括任何已签名,未签名且符合cv标准的 表明即使他们的规范完全匹配。

4 个答案:

答案 0 :(得分:20)

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>中,并被视为数字。在这两个地方都没有这么重复。

答案 1 :(得分:4)

两者都相同,并提供相同的输出。

但是,自C98以来std::numeric_limits<T>::is_integer存在,而不是C ++ 11,而std :: is_integral是作为C ++ 11类型特征(<type_traits>标题)的一部分引入的

编辑:

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

答案 2 :(得分:4)

没有人提到std::is_integral遵循与定义名为value的单个静态数据成员的其他C ++ 11 UnaryTypeTraits相同的样式的观点。这使得它可以在需要任何一元类型特征的情况下互换使用,例如:

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

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

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

答案 3 :(得分:3)

Here'sis_integral添加到C ++ 0x的原始提案。

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