【问题标题】:Boost numeric_cast<> with a default value instead of an exception?使用默认值而不是异常来提升 numeric_cast<>?
【发布时间】:2010-01-03 00:06:17
【问题描述】:

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

我不太担心所有额外异常处理的性能,但我宁愿使用标准模板也不愿编写无用的包装函数。另外,根据以往的经验,我认为boost很可能真的有我的想法,我只是没有找到。

【问题讨论】:

  • 重点是它确实抛出异常。如果您不想要,只需投射即可。
  • nobugs:numeric_cast 检测上溢和下溢,而“just cast”不会。

标签: c++ boost


【解决方案1】:

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

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

据我所知,Boost 没有您想的那样,但它为您提供了自己构建它的工具。

【讨论】:

    【解决方案2】:
    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】:

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

      但是,定制解决方案的效率会更高。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-21
        • 2015-09-28
        • 1970-01-01
        • 2014-02-16
        • 1970-01-01
        相关资源
        最近更新 更多