我们希望在两个数字类型之间进行检查数字转换,而不会在失败时触发异常抛出.就像是:
bool numeric_cast(Source s, Target &t)
Run Code Online (Sandbox Code Playgroud)
我们的项目中提升了错误处理,生成了调用堆栈和其他一些昂贵的东西.我有可能转换失败的地方,我不想在每次失败时付出那么高的代价.
正如我在标题中看到的那样,只有一种方法可以抛出异常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.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |