模板区分有符号和无符号
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)
。这些是编译时常量。请参阅 如何将其转化为错误。
如果已经编写了一个模板函数,并且代码只有在模板类型未被标记的情况下才能正常工作。 现在我正在寻找一种方法来防止函数在没有 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)
。这些是编译时常量。请参阅