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

时间:2017-10-05 20:49:38

标签: c++ c++11 unsigned signed

我目前在我的代码中有一个将数字类型转换为字符串的函数。由于我没有使用std::to_string的原因。现在这个代码在XCode上构建得很好但是窗口似乎在抱怨。 Windows抱怨的原因是因为在某一点上我传递的是无符号类型,然后对其进行否定仍然保持正数,因为类型是无符号的。我的问题是我可以在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] = '\0';
            return str;
        }

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

我该如何解决这个问题?有没有办法告诉编译器只有类型是无符号的,请进入这里?

1 个答案:

答案 0 :(得分:0)

使用支持C ++ 17的现代编译器one could use 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()
}

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