虽然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 应该是正确的。