我发现一些模板化的代码在某些时候执行以下检查:
template<class IntegralType>
void randomFunction(IntegralType t)
{
...
if (t < 0)
...
}
该代码的想法是
t
是整数类型(有符号或无符号)。该代码无论有没有签名都可以正常工作,但是编译器会发出警告,因为对于unsigned
整数,检查始终为true。C++ 03 中是否可以通过修改代码来消除警告而不抑制警告?我正在考虑以某种方式检查
T
的签名,不知道这是可能的。我知道C++ 11的
is_signed
,但不确定如何在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中实现。