模板区分有符号和无符号

Template distinguish between signed and unsigned

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

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

std::is_signed 仅在 C++11 之后可用,但在此之前您可以使用 std::numeric_limits<T>::is_signed

由于 static_assert 也是 C++11,你必须使用其他东西,例如来自 here 的技巧:

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

没有库:对于有符号类型,~T(0) < T(0) 但对于无符号类型,~T(0) > T(0)。这些是编译时常量。请参阅 如何将其转化为错误。