由于未签名,消除了模板化方法中的警告
Get rid of warning in templated method due to unsignedness
我发现了一些模板化代码,它们有时会执行以下检查:
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (t < 0)
...
}
代码的思路是t
是整数类型(有符号或无符号)。无论是否有符号,代码都可以正常工作,但编译器会发出警告,因为在 unsigned
整数的情况下,检查将始终为真。
在 C++03 中是否有一种方法可以修改代码以消除警告而不抑制它?我正在考虑以某种方式检查 T
的签名,不知道是否可行。
我知道 C++11 的 is_signed
但我不确定它如何在 C++03 中实现。
C++11 有 is_signed
和 cppreference 表明这是可能的实现:
namespace detail {
template<typename T,bool = std::is_arithmetic<T>::value>
struct is_signed : std::integral_constant<bool, T(-1) < T(0)> {};
template<typename T>
struct is_signed<T,false> : std::false_type {};
} // namespace detail
template<typename T>
struct is_signed : detail::is_signed<T>::type {};
问题是 is_integral_constant
也仅在 C++11 中可用,但是,这可能是您在 C++03 中实现相同功能的起点。
使用标签调度和特征:
template <typename T>
bool is_negative(T t, std::true_type)
{
return t < 0;
}
template <typename T>
bool is_negative(T t, std::false_type)
{
return false;
}
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (is_negative(t, std::is_signed<IntegralType>::type())
...
}
std::is_signed
可以在C++03中实现。
我一直在寻找解决这个问题的方法。
我发现的最佳解决方案是使用与此 answer:
中相同的想法
if (!(t == 0 || t > 0))
这可能是特定于编译器的解决方法,但至少在 g++ 4.4.7 中警告消失了。
我发现了一些模板化代码,它们有时会执行以下检查:
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (t < 0)
...
}
代码的思路是t
是整数类型(有符号或无符号)。无论是否有符号,代码都可以正常工作,但编译器会发出警告,因为在 unsigned
整数的情况下,检查将始终为真。
在 C++03 中是否有一种方法可以修改代码以消除警告而不抑制它?我正在考虑以某种方式检查 T
的签名,不知道是否可行。
我知道 C++11 的 is_signed
但我不确定它如何在 C++03 中实现。
C++11 有 is_signed
和 cppreference 表明这是可能的实现:
namespace detail {
template<typename T,bool = std::is_arithmetic<T>::value>
struct is_signed : std::integral_constant<bool, T(-1) < T(0)> {};
template<typename T>
struct is_signed<T,false> : std::false_type {};
} // namespace detail
template<typename T>
struct is_signed : detail::is_signed<T>::type {};
问题是 is_integral_constant
也仅在 C++11 中可用,但是,这可能是您在 C++03 中实现相同功能的起点。
使用标签调度和特征:
template <typename T>
bool is_negative(T t, std::true_type)
{
return t < 0;
}
template <typename T>
bool is_negative(T t, std::false_type)
{
return false;
}
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (is_negative(t, std::is_signed<IntegralType>::type())
...
}
std::is_signed
可以在C++03中实现。
我一直在寻找解决这个问题的方法。
我发现的最佳解决方案是使用与此 answer:
中相同的想法 if (!(t == 0 || t > 0))
这可能是特定于编译器的解决方法,但至少在 g++ 4.4.7 中警告消失了。