is_integral和is_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标准的 表明即使他们的规范完全匹配。
答案 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's将is_integral
添加到C ++ 0x的原始提案。
他们没有提及与std::numeric_limits<>::is_integer
的重叠,但我假设只是希望将所有类型的特征放在一个明显的位置。