我发现一些模板化的代码在某些时候执行以下检查:

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中实现。

09-16 10:08