提升numeric_cast<>使用默认值而不是例外?

时间:2010-01-03 00:06:17

标签: c++ boost

每当boost的numeric_cast<>转换失败时,它都会抛出异常。在boost中是否有类似的模板允许我指定一个默认值,或者在这种情况下我唯一可以做的事情就是捕获异常?

我并不太担心所有额外异常处理的性能,但我宁愿使用标准模板而不是编写无用的包装函数。此外,根据过去的经验,我认为提升实际上可能有我想到的,而我根本就没有找到它。

3 个答案:

答案 0 :(得分:6)

numeric_cast函数只使用默认参数调用boost::numeric::converter模板类。其中一个参数是OverflowHandler,其默认值为def_overflow_handler,但您可以指定silent_overflow_handler来取消异常。

然后指定FloatToIntRounder参数,如果输入参数超出所需范围,则该参数将提供所需的默认值。参数是通常用于提供从浮点类型舍入的整数,但你可以真正使用它来做任何你想要的。更多信息,以及描述事件顺序的代码,位于converter documentation

据我所知,Boost没有你想到的东西,但它为你自己构建它提供了便利。

答案 1 :(得分:5)

template<class Target, class Source>
typename boost::numeric::converter<Target,Source>::result_type
numeric_cast_defaulted(Source arg, Target default_value = Target()) try {
  return boost::numeric_cast<Target>(Source);
}
catch (boost::bad_numeric_cast&) {
  return default_value;
}

答案 2 :(得分:3)

已经多次在boost邮件列表中讨论过这个问题,但是还没有接受统一的解决方案。在此之前,您可以使用以下占位符函数,但是,由于异常提升它既不是样式也不是效率方面很好:

template<typename Target, typename Source>
  inline Target default_numeric_cast(Source arg, Target def)
{
    try {
        return numeric_cast<Target,Source>(arg);
    } catch (...) {
        return def;
    }
}

然而,定制的解决方案会更有效率。