c++ - 类型推广与实现

标签 c++ c++11 std

同时 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 的类型的算术运算时,这是不可避免的我只看到两种克服此警告的方法:

  1. 复杂。 return adder(!value, 1);其中 adder函数是一个 按位求和器。您可能会发现它是如何在硬件中实现的,并且 自己实现一个。
  2. 简单。 return static_cast<T>(-value) .由于您没有任何可能导致类型溢出的算术运算 T “取消”升级到 int 是绝对安全的

关于c++ - 类型推广与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15055378/

相关文章:

c++ - 我最近在阅读 opencv 源代码。有没有更好的方法在 opencv 库中查找类定义?

c++ - 从 VS 2008 转换到 VS 2012 时出现 LNK1181 错误

c++ - boost::optional - 将 boost::in_place 用于构造函数通过引用获取其他对象的对象

c++ - C++11 中可变参数模板的函数组合

c++ - 确保在编译时调用方法

c++ - 将 vector<UINT16> 的一部分复制到 double 变量中

c++ - 使用 QueryPerformanceCounter() 倒计时

c++ - 在 MinGW/MSYS 上编译 GCC 4.x.x 失败

c++ - C++ 标准库中的 boost::optional 替代方案

c++ - std::assert 发生了什么