boost :: numeric_cast功能毫无例外

时间:2013-12-19 13:00:28

标签: c++ boost casting

我们希望在两种数字类型之间进行检查数字转换,而不会在失败时触发异常抛出。类似的东西:

bool numeric_cast(Source s, Target &t)

我们的项目中提升了错误处理,生成了调用堆栈和其他一些昂贵的东西。我有可能转换失败的地方,我不想在每次失败时付出那么高的代价。

1 个答案:

答案 0 :(得分:8)

正如我从标题中看到的那样,只有一种方法可以在numeric_cast中抛出异常 - 它是溢出的。

您可以编写overflow_policy(或在这种情况下使用silent_overflow_handler)。但是你应该为

编写专业化
template <typename Target, typename Source, typename EnableIf = void>
struct numeric_cast_traits
{
    typedef def_overflow_handler    overflow_policy;
    typedef UseInternalRangeChecker range_checking_policy;
    typedef Trunc<Source>           rounding_policy;
};

我不对......在我看来,真正重写numeric_cast功能会更简单

template <typename Target, typename Source> 
inline Target numeric_cast( Source arg )
{
    typedef numeric::conversion_traits<Target, Source>   conv_traits;
    typedef numeric::numeric_cast_traits<Target, Source> cast_traits;
    typedef boost::numeric::converter
        <
            Target,
            Source, 
            conv_traits,
            typename cast_traits::overflow_policy, 
            typename cast_traits::rounding_policy, 
            boost::numeric::raw_converter< conv_traits >,
            typename cast_traits::range_checking_policy
        > converter;
    return converter::convert(arg);
}

应该看起来像

template <typename Target, typename Source> 
inline Target numeric_cast( Source arg )
{
    typedef numeric::conversion_traits<Target, Source>   conv_traits;
    typedef numeric::numeric_cast_traits<Target, Source> cast_traits;
    typedef boost::numeric::converter
        <
            Target,
            Source, 
            conv_traits,
            my_overflow_policy,
            typename cast_traits::rounding_policy,
            boost::numeric::raw_converter< conv_traits >,
            typename cast_traits::range_checking_policy
        > converter;
    return converter::convert(arg);
}

此外,您可以定义BOOST_NO_EXCEPTIONS,然后只需throw,而不是boost::throw_exception