我们希望在两种数字类型之间进行检查数字转换,而不会在失败时触发异常抛出。类似的东西:
bool numeric_cast(Source s, Target &t)
我们的项目中提升了错误处理,生成了调用堆栈和其他一些昂贵的东西。我有可能转换失败的地方,我不想在每次失败时付出那么高的代价。
答案 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
。