在模板方法消除警告由于unsignedness
我发现它在某些时候进行以下检查一些模板代码:在模板方法消除警告由于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警告消失。
以上是 在模板方法消除警告由于unsignedness 的全部内容, 来源链接: utcz.com/qa/263775.html