每当boost的numeric_cast<>
转换失败时,它都会抛出异常。在boost中是否有类似的模板允许我指定一个默认值,或者在这种情况下我唯一可以做的事情就是捕获异常?
我并不太担心所有额外异常处理的性能,但我宁愿使用标准模板而不是编写无用的包装函数。此外,根据过去的经验,我认为提升实际上可能有我想到的,而我根本就没有找到它。
答案 0 :(得分:6)
numeric_cast
函数只使用默认参数调用boost::numeric::converter
模板类。其中一个参数是OverflowHandler
,其默认值为def_overflow_handler
,但您可以指定silent_overflow_handler
来取消异常。
然后指定FloatToIntRounder
参数,如果输入参数超出所需范围,则该参数将提供所需的默认值。参数是通常用于提供从浮点类型舍入的整数,但你可以真正使用它来做任何你想要的。更多信息,以及描述事件顺序的代码,位于converter
documentation。
据我所知,Boost没有你想到的东西,但它为你自己构建它提供了便利。
答案 1 :(得分:5)
template<class Target, class Source>
typename boost::numeric::converter<Target,Source>::result_type
numeric_cast_defaulted(Source arg, Target default_value = Target()) try {
return boost::numeric_cast<Target>(Source);
}
catch (boost::bad_numeric_cast&) {
return default_value;
}
答案 2 :(得分:3)
已经多次在boost邮件列表中讨论过这个问题,但是还没有接受统一的解决方案。在此之前,您可以使用以下占位符函数,但是,由于异常提升它既不是样式也不是效率方面很好:
template<typename Target, typename Source>
inline Target default_numeric_cast(Source arg, Target def)
{
try {
return numeric_cast<Target,Source>(arg);
} catch (...) {
return def;
}
}
然而,定制的解决方案会更有效率。