📄 numeric_cast.qbk
字号:
[/ Boost.Optional Copyright (c) 2003-2007 Fernando Luis Cacciola Carballal Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)][section Improved numeric_cast<>][section Introduction]The lack of preservation of range makes conversions between numeric typeserror prone. This is true for both implicit conversions and explicitconversions (through `static_cast`).[link numeric_conversion_numeric_cast `numeric_cast`]detects loss of range when a numeric type is converted, and throws anexception if the range cannot be preserved.There are several situations where conversions are unsafe:* Conversions from an integral type with a wider range than the target integral type.* Conversions from unsigned to signed (and vice versa) integral types.* Conversions from floating point types to integral types.The C++ Standard does not specify the behavior when a numeric type isassigned a value that cannot be represented by the type, except for unsignedintegral types \[3.9.1.4\], which must obey the laws of arithmetic modulo 2n(this implies that the result will be reduced modulo the number that is onegreater than the largest value that can be represented). The fact that thebehavior for overflow is undefined for all conversions (except theaforementioned unsigned to unsigned) makes any code that may producepositive or negative overflows exposed to portability issues.`numeric_cast` adheres to the rules for implicit conversions mandated bythe C++ Standard, such as truncating floating point types when convertingto integral types. The implementation must guarantee that for a conversionto a type that can hold all possible values of the source type, there willbe no runtime overhead.[endsect][#numeric_conversion_numeric_cast][section numeric_cast] template<typename Target, typename Source> inline typename boost::numeric::converter<Target,Source>::result_type numeric_cast ( Source arg ) { return boost::numeric::converter<Target,Source>::convert(arg); }`numeric_cast` returns the result of converting a value of type Sourceto a value of type Target. If out-of-range is detected, an exception isthrown (see [link numeric_conversion_bad_numeric_cast bad_numeric_cast],[link numeric_conversion_negative_overflow negative_overflow] and[link numeric_conversion_possitive_overflow positive_overflow]).[endsect][section Examples]The following example performs some typical conversions between numeric types:#include <boost/numeric/conversion/cast.hpp>#include <iostream> int main() { using boost::numeric_cast; using boost::numeric::bad_numeric_cast; using boost::numeric::positive_overflow; using boost::numeric::negative_overflow; try { int i=42; short s=numeric_cast<short>(i); // This conversion succeeds (is in range) } catch(negative_overflow& e) { std::cout << e.what(); } catch(positive_overflow& e) { std::cout << e.what(); } try { float f=-42.1234; // This will cause a boost::numeric::negative_overflow exception to be thrown unsigned int i=numeric_cast<unsigned int>(f); } catch(bad_numeric_cast& e) { std::cout << e.what(); } double d= f + numeric_cast<double>(123); // int -> double unsigned long l=std::numeric_limits<unsigned long>::max(); try { // This will cause a boost::numeric::positive_overflow exception to be thrown // NOTE: *operations* on unsigned integral types cannot cause overflow // but *conversions* to a signed type ARE range checked by numeric_cast. unsigned char c=numeric_cast<unsigned char>(l); } catch(positive_overflow& e) { std::cout << e.what(); } return 0; }[endsect][endsect]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -