Is_integral vs is_integer:是冗余的
is_integral vs is_integer: is one of them redundant?
is_integral和is_integer似乎以相同的方式回答。
从相关文档页面的链接来看,is_integral
似乎缺少以下类型的专门化
signed char
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
然而,一个编译的例子,当然也显示了它们在这些类型上的相同行为:
#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
文档页中的任何有符号的、无符号的和cv限定的变体表明它们的规范是完全匹配的。
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>
中存在哪些类型特征,哪些类型特征被认为是数字的,就会有一个稍微任意的边界。在两个地方都有,这并不是一个可怕的重复。
Noone提到std::is_integral
遵循与其他c++ 11 UnaryTypeTraits相同的风格,即定义一个名为value
的静态数据成员。这使得它可以在需要一元类型trait的地方互换使用,例如:
template<typename Cond1, typename Cond2>
using And = integral_constant<bool, Cond1::value && Cond2::value>;
你不能以同样的方式使用std::numeric_limits::is_integer
,因为它不遵循与c++ 11特征相同的约定。
将每个trait拆分为具有一致名称的单个类型,使它们比将多个属性捆绑在一起并使用不可预测的名称的trait更灵活。
两者是相同的,并且将提供相同的输出。
但是std::numeric_limits<T>::is_integer
从C98开始就存在了,而不是c++ 11,而std::is_integral是作为c++ 11类型trait的一部分引入的(<type_traits>
头文件)
正如@Useless提到的,引入std::is_integral的原因可能是希望重新组合<type_traits>
中的所有特征。
这是将is_integral
添加到c++ 0x的原始提案。
他们没有提到与std::numeric_limits<>::is_integer
的重叠,但我假设他们的愿望只是将所有类型特征放在一个明显的地方。
- 如何擦除冗余输入?
- 使用提升几何缓冲区缩放多边形时的冗余折点
- 我应该担心冗余声明吗?
- Qt的slot(?)将冗余命名空间插入连接
- 方法冗余移动调用的移动语义
- 使用 llvm 和本地值编号算法擦除冗余表达式
- 优化堆上创建的冗余变量
- 如何消除访客模式冗余?
- 表达式模板需要冗余重载
- C++,处理多个构造函数重载和冗余代码
- 使用模板基类消除工厂类派生类冗余的干净方法
- 连接两个文件时如何避免冗余尾随换行符?
- CMake:修改共享库时的冗余链接
- 提升精神 X3:"属性没有预期的大小"冗余
- 如何简化此冗余C++代码?
- 是``if`语句''在modulo之前和分配操作之前的冗余
- 使用最终类说明符时,最终函数说明符是否冗余?
- 简化冗余std :: array初始化,当时没有constexpr构造函数
- 尝试使用 OpenMP 并行化递归函数的冗余计算
- Linux C LIBEV官方示例显示了冗余控制台行为