由于无符号,在模板化方法中删除警告

问题描述 投票:4回答:3

我找到了一些模板化的代码,在某些时候执行以下检查:

template<class IntegralType>
void randomFunction(IntegralType t)
{
    ...
    if (t < 0)
    ...
}

代码的想法是t是一个整数类型(有符号或无符号)。无论签名如何,代码都可以正常工作,但编译器会发出警告,因为在unsigned整数的情况下,检查将始终为true。

在C ++ 03中有没有办法修改代码以摆脱警告而不抑制它?我想以某种方式检查T的签名,不知道它是否可能。

我知道C ++ 11的is_signed,但我不确定它是如何在C ++ 03中实现的。

c++ templates compiler-warnings c++03
3个回答
6
投票

使用Tag调度和特征:

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


3
投票

C ++ 11有is_signedcppreference显示这是可能的实现:

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中实现相同的起点。


1
投票

我一直在寻找这个问题的解决方案。

我发现的最佳解决方案是使用与此answer相同的想法:

    if (!(t == 0 || t > 0))

它可能是特定于编译器的解决方法,但至少在g ++ 4.4.7中,警告消失了。

© www.soinside.com 2019 - 2024. All rights reserved.