std::abs
(またはC::abs
開発者の場合)戻り値を昇格させないため、 handle を処理しませんが、より「安全な」処理を行う実装が必要です。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 が正しいはずです。