C++ 有界类型的静态类型转换

C++ 有界类型的静态类型转换,c++,C++,当您使用经典的静态_转换(或c转换)简单地转换一个int时,如果该值超出了短限制,编译器将截断该int 例如: int i = 70000; short s = static_cast<short>(i); std::cout << "s=" << s << std::endl; 我需要一个能够使用类型限制的“智能”强制转换,在本例中返回32767。诸如此类: template<class To, class From> To bou

当您使用经典的静态_转换(或c转换)简单地转换一个int时,如果该值超出了短限制,编译器将截断该int

例如:

int i = 70000;
short s = static_cast<short>(i);
std::cout << "s=" << s << std::endl;
我需要一个能够使用类型限制的“智能”强制转换,在本例中返回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);
}
模板
到有界_转换(从值)
{
如果(值>标准::数值限制::最大值())
{
返回std::numeric_limits::max();
}
如果(值
这个函数可以很好地处理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();
  }
}
模板
到有界_转换(从值)
{
尝试
{
返回boost::numeric::converter::convert(值);
}
捕获(常量提升::数值::正溢出&)
{
返回std::numeric_limits::max();
}
捕获(常量提升::数值::负溢出&)
{
返回std::numeric_limits::min();
}
}
看看boost的。我认为您需要定义一个将源值截断到目标合法范围的函数(但我还没有尝试过)。总之,它可能需要比上面的示例更多的代码,但如果您的需求发生变化,它应该更加健壮

读下面的问题


当抛出异常时,可以使用std::numeric_list作为默认值

您不应该将答案放在原始问题中。但是,您可以发布自己问题的答案。我鼓励你把你的问题删掉,并把它写进答案里。
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();
  }
}