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

Nik*_*iou 21 c++ stl c++11

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

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

signed char       
unsigned char     
unsigned short    
unsigned int      
unsigned long     
unsigned long long
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果它们的行为相同,那么在C++ 11中引入它们有什么意义呢?

因此,如果它们的行为相同,那么在c ++ 11中引入它们有什么意义呢?

编辑:改写

作为无用指出,短语包括任何符号,无符号和CV-合格变种is_integral文档页面显示,即使它们的规格是完全一致.

Use*_*ess 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>,并且被认为是数字.在这两个地方拥有它并不是一个可怕的重复.


Jon*_*ely 5

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

template<typename Cond1, typename Cond2>
  using And = integral_constant<bool, Cond1::value && Cond2::value>;
Run Code Online (Sandbox Code Playgroud)

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

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