C ++ 11提供了两种类型的特征模板类:std::is_integer
和std::is_integral
。但是,我不能说出它们之间的区别。
什么类型,例如T,可以使std::is_integer<T>::value
成立并使std::is_integral<T>::value
成为假?
答案 0 :(得分:20)
std::is_integer<T>
不存在。
话虽如此,std::numeric_limits<T>::is_integer
确实存在。
我不知道std::numeric_limits<T>::is_integer
和std::is_integral<T>
之间存在任何显着差异。后者的设计要晚得多,并且在C ++ 11中成为标准,而前者则是在C ++ 98中引入的。
答案 1 :(得分:12)
T
和std::is_integral<T>::value
没有类型std::numeric_limits<T>::is_integer
有不同的结果。引用draft Standard:
3.9.1基本类型[basic.fundamental]
7类型bool,char,char16_t,char32_t,wchar_t,以及签名和 无符号整数类型统称为整数类型。一个 整数类型的同义词是整数类型。[...]
18.3.2.4 numeric_limits members [numeric.limits.members]
static constexpr bool is_integer;
17如果类型是整数,则为真。
20.9.4.1主要类型类别[meta.unary.cat] (表47)
template <class T> struct is_integral;
T是整数类型(3.9.1)
答案 2 :(得分:1)
std::is_integral_v<T>
仅对内置整数返回true。
该标准允许std::numeric_limits<T>::is_integer
专用,并为boost::multiprecion::cpp_int
等自定义整数类型返回true。
答案 3 :(得分:1)
std::is_integral<T>
和std::numeric_limits<T>::is_integer
不同。例如。 boost::multiprecision
大整数的处理方式有所不同。
这是来自相应的问题:
另一方面,
is_integral
返回有关类型性质的信息,并且为 仅对“本机”整数类型为true,对于 类类型。也就是说is_integer
和is_class
相互 独家。
numeric_limits
返回有关 类型的行为-是否为特定概念建模 将-因此应该专门用于UDT。注意专业is_integer
代表UDT将破坏代码,因为is_integer
暗示 其他很多事情也都是真实的,例如琐碎的移动/复制/初始化 等
答案 4 :(得分:0)
区别在于std::is_integral<T>
只会识别十进制整数,包括bool
char
char16_t
char32_t
wchar_t
short
{{ 1}} int
long
。虽然long long
会识别所有这些内容以及std::numeric_limits<T>::is_integer
float
。请查看这两页以获取更多信息:is_integer,is_integral