boost :: numeric_cast功能毫无例外

Not*_*ist 1 c++ boost casting

我们希望在两个数字类型之间进行检查数字转换,而不会在失败时触发异常抛出.就像是:

bool numeric_cast(Source s, Target &t)
Run Code Online (Sandbox Code Playgroud)

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

For*_*veR 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;
};
Run Code Online (Sandbox Code Playgroud)

我不对......在我看来,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);
}
Run Code Online (Sandbox Code Playgroud)

应该是这样的

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);
}
Run Code Online (Sandbox Code Playgroud)

此外,您可以定义BOOST_NO_EXCEPTIONS,然后它将简单throw,没有boost::throw_exception.