当您使用经典的static_cast(或c cast)转换int时,如果该值超出了short限制,编译器将截断int。
例如:
int i = 70000;
short s = static_cast<short>(i);
std::cout << "s=" << s << std::endl;
将显示:
s=4464
我需要一个能够使用类型限制的“智能”演员,在这种情况下返回32767.这样的事情:
template<class To, class From>
To bounded_cast(From value)
{
if( value > std::numeric_limits<To>::max() )
{
return std::numeric_limits<To>::max();
}
if( value < std::numeric_limits<To>::min() )
{
return std::numeric_limits<To>::min();
}
return static_cast<To>(value);
}
这个函数适用于int,short和char,但需要一些改进才能使用double和float。
但这不是车轮的重新发明吗?
你知道现有的图书馆吗?
修改 的
感谢。我发现的最佳解决方案是:
template<class To, class From>
To bounded_cast(From value)
{
try
{
return boost::numeric::converter<To, From>::convert(value);
}
catch ( const boost::numeric::positive_overflow & )
{
return std::numeric_limits<To>::max();
}
catch ( const boost::numeric::negative_overflow & )
{
return std::numeric_limits<To>::min();
}
}
答案 0 :(得分:5)
看一下boost Numeric Conversion library。我认为您需要定义一个overflow policy,将源值截断到目标的合法范围(但我还没有尝试过)。总之,它可能需要比上面的示例更多的代码,但如果您的需求发生变化,则应该更加强大。
答案 1 :(得分:0)
阅读Boost numeric_cast<> with a default value instead of an exception?提问。
当抛出异常时,您可以使用std :: numeric_list作为默认值