如果已编写了模板函数,并且仅在未指定模板类型的情况下,代码才能正常工作。 现在,我正在寻找一种方法来防止功能在没有C ++ 11的情况下使用带符号的类型进行编译。
template<typename T>
T foo() {
T a=0;
return a<<1;
}
答案 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如何将其变成错误。