同时 std::abs
(或 ::abs
对于 C 开发者)不提升返回值,因此不处理 std::numeric_limit<T>::min()
, 我想要一个 abs
实现,它进行更“安全”的处理。
template <typename T>
typename std::make_unsigned<typename std::enable_if<std::is_signed<T>::value, T>::type>::type secure_abs( T value ) {
if( value >= 0 )
return value;
if( value == std::numeric_limits<T>::min() )
return *reinterpret_cast<typename std::make_unsigned<T>::type*>(&value);
return -value; //TODO: Prevent promotion to int
}
我还没有弄清楚的是,如何防止提升为 int 后的转换警告(当删除减号时)。
有没有更优雅/正确的方法来删除减号?
编辑:
现在对于 INT_MIN 和 2complement 应该是正确的。
最佳答案
自类型提升到int
当使用“等级”低于 int
的类型的算术运算时,这是不可避免的我只看到两种克服此警告的方法:
- 复杂。
return adder(!value, 1);
其中adder
函数是一个 按位求和器。您可能会发现它是如何在硬件中实现的,并且 自己实现一个。 - 简单。
return static_cast<T>(-value)
.由于您没有任何可能导致类型溢出的算术运算T
“取消”升级到int
是绝对安全的
关于c++ - 类型推广与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055378/