【发布时间】:2019-09-17 08:43:49
【问题描述】:
如果已经编写了一个模板函数,并且代码只有在模板类型未指定的情况下才能正常工作。 现在我正在寻找一种方法来防止函数在没有 C++11 的情况下使用签名类型进行编译。
template<typename T>
T foo() {
T a=0;
return a<<1;
}
【问题讨论】:
如果已经编写了一个模板函数,并且代码只有在模板类型未指定的情况下才能正常工作。 现在我正在寻找一种方法来防止函数在没有 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)。这些是编译时常量。请参阅the other answer 如何将其变为错误。
【讨论】: