错误 一元减号运算符应用于无符号类型会导致无符号



我目前在我的代码中有一个函数,可以将数字类型转换为字符串。由于我没有使用std::to_string的原因。现在这段代码在 XCode 上构建得很好,但窗口似乎在抱怨。窗口抱怨的原因是,在某一时刻,我传递了一个无符号类型,然后对它执行负数,因为它是无符号的,所以仍然保持正数。 我的问题是我可以放一个 if 类来检查类型是否签名,然后输入条件吗?会解决问题吗

    template<typename t>
    std::string MyFunct(t num,int base=10)
    {
        char str [sizeof(t)*8+1];
        int i = 0;
        bool isNegative = false;

        if (num == 0)
        {
            str[i++] = '0';
            str[i] = '';
            return str;
        }
        //Negative only when base is 10
        if (num < 0 && base == 10)
        {
            isNegative = true;
            num = -num; //<------ERROR in case the type is unsigned
        }
        ....
        ....
    }

我该如何解决这个问题?有没有办法让我只在类型未签名时才告诉编译器进入这里?

使用支持 C++17 的现代编译器,可以将constexpr ifstd::numeric_limits<T>::is_signed 一起使用,以仅对有符号整数类型执行否定。请注意,普通if仍可能导致编译器诊断,constexpr if是必需的。

constexpr if的替代方案是相当简单的模板专用化:

template<typename t, bool is_signed=std::numeric_limits<T>::is_signed>
    std::string MyFunct(t num,int base=10);
template<typename t>
std::string MyFunct<t, true>(t num,int base10)
{
    // The signed specialization of MyFunct()
}
template<typename t>
std::string MyFunct<t, false>(t num,int base)
{
    // The unsigned specialization of MyFunct()
}

只有转换函数的有符号版本才会使用否定逻辑。当然,函数的有符号和无符号版本都有很多共同的代码;但现在,这变成了一种普通的情况,只需简单、直接的重构。

相关内容

  • 没有找到相关文章

最新更新