gpt4 book ai didi

c++ - boost::numeric_cast 功能无一异常(exception)

转载 作者:太空宇宙 更新时间:2023-11-03 10:29:39 25 4
gpt4 key购买 nike

我们希望在两种数字类型之间进行经过检查的数字转换,而不会在失败时引发异常。像这样的东西:

bool numeric_cast(Source s, Target &t)

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

最佳答案

正如我从 header 中看到的那样,只有一种方法可以在 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

关于c++ - boost::numeric_cast 功能无一异常(exception),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20682457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com