在模板方法消除警告由于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

回到顶部