is_integral和is_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>,并且被认为是数字.在这两个地方拥有它并不是一个可怕的重复.
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 特征相同的约定。
将每个特征拆分为具有一致名称的单一类型,使它们比将多个属性与不可预测的名称捆绑在一起的特征更加灵活。