代码之家  ›  专栏  ›  技术社区  ›  Roman Starkov

用默认值而不是异常来增强数值强制转换<>

  •  4
  • Roman Starkov  · 技术社区  · 16 年前

    无论何时增压 numeric_cast<> 转换失败,引发异常。Boost中是否有类似的模板允许我改为指定默认值,或者捕获异常是我在这种情况下唯一能做的事情?

    我不太担心所有额外异常处理的性能,但我宁愿使用标准模板,也不愿编写无用的包装函数。此外,从过去的经验来看,我认为Boost很可能真的有我所想的,而我只是没有找到它。

    3 回复  |  直到 13 年前
        1
  •  6
  •   Rob Kennedy    16 年前

    这个 numeric_cast 函数只调用 boost::numeric::converter 具有默认参数的模板类。其中一个论点是 OverflowHandler ,默认值为 def_overflow_handler ,但可以指定 silent_overflow_handler 以抑制异常。

    然后指定 FloatToIntRounder 如果输入参数超出所需范围,则提供所需默认值的参数。争论是 正常地 用于为浮点类型的舍入提供整数,但实际上可以将其用于所需的任何内容。更多信息,加上描述事件序列的代码, converter documentation .

    据我所知,Boost没有你想要的,但它为你自己建造它提供了便利。

        2
  •  5
  •   Roger Pate    16 年前
    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;
    }
    
        3
  •  3
  •   Kornel Kisielewicz    16 年前

    这已经在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;
        }
    }
    

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