模板区分有符号和无符号

时间:2019-09-17 08:43:49

标签: c++ templates c++98

如果已编写了模板函数,并且仅在未指定模板类型的情况下,代码才能正常工作。 现在,我正在寻找一种方法来防止功能在没有C ++ 11的情况下使用带符号的类型进行编译。

template<typename T>
T foo() {
    T a=0;
    return a<<1;
}

2 个答案:

答案 0 :(得分:4)

std::is_signed仅从C ++ 11开始可用,但是在您可以使用std::numeric_limits<T>::is_signed之前。

由于static_assert也是C ++ 11,因此您必须使用其他方法,例如here的技巧:

typedef int static_assert_something[something ? 1 : -1];

答案 1 :(得分:0)

不带库:对于带符号类型,~T(0) < T(0),对于无符号类型,~T(0) > T(0)。这些是编译时常量。请参阅the other answer如何将其变成错误。