From b8d831b373eafdda2b2eb100b5673b2b99deff6e Mon Sep 17 00:00:00 2001 From: Dmitry Arkhipov Date: Mon, 23 May 2022 20:48:57 +0300 Subject: [PATCH] better showcase value::to_number --- doc/qbk/03_05_numbers.qbk | 5 ++--- test/doc_using_numbers.cpp | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/doc/qbk/03_05_numbers.qbk b/doc/qbk/03_05_numbers.qbk index be98fa1f..4cd04530 100644 --- a/doc/qbk/03_05_numbers.qbk +++ b/doc/qbk/03_05_numbers.qbk @@ -28,7 +28,7 @@ and calling `get_double` will result in undefined behavior: [doc_using_numbers_2] In cases where you know that a __value__ contains a number -but don't know its __kind__, __value_to__ can be used to convert +but don't know its __kind__, `value::to_number` can be used to convert the __value__ to an arithmetic type: [doc_using_numbers_3] @@ -40,8 +40,7 @@ converted to `T` as-if by `static_cast`: [doc_using_numbers_4] -Arithmetic conversions done by __value_to__ delegate to -`value::to_number`. In settings where exceptions cannot be used, +In settings where exceptions cannot be used, an overload of `value::to_number` accepting __error_code__ can be used instead with identical semantics to its throwing counterpart: diff --git a/test/doc_using_numbers.cpp b/test/doc_using_numbers.cpp index 6dfc8e44..c88ffc4d 100644 --- a/test/doc_using_numbers.cpp +++ b/test/doc_using_numbers.cpp @@ -75,15 +75,8 @@ if(double* d = jv.if_double()) //---------------------------------------------------------- { //[doc_using_numbers_3 -struct convert_int64 -{ - value jv; - - operator int() const - { - return value_to< int >( this->jv ); - } -}; +value jv = 1; +assert( jv.to_number< int >() == 1 ); //] } //---------------------------------------------------------- @@ -95,30 +88,30 @@ try assert( jv1.is_int64() ); // ok, identity conversion - std::int64_t r1 = value_to< std::int64_t >( jv1 ); + std::int64_t r1 = jv1.to_number< std::int64_t >( ); // loss of data, throws system_error - char r2 = value_to< char >( jv1 ); + char r2 = jv1.to_number< char >(); // ok, no loss of data - double r3 = value_to< double >( jv1 ); + double r3 = jv1.to_number< double >(); value jv2 = 1.23; assert( jv1.is_double() ); // ok, same as static_cast( jv2.get_double() ) - float r4 = value_to< float >( jv2 ); + float r4 = jv2.to_number< float >(); // not exact, throws system_error - int r5 = value_to< int >( jv2 ); + int r5 = jv2.to_number< int >(); value jv3 = {1, 2, 3}; assert( ! jv3.is_number() ); // not a number, throws system_error - int r6 = value_to< int >( jv3 ); + int r6 = jv3.to_number< int >(); //] } catch(...)