diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index f3d841f..29bb4e3 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1155,6 +1155,23 @@ U operator&( result&& r, F&& f ) } } +template()() ), + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type +> +U operator&( result const& r, F&& f ) +{ + if( r.has_error() ) + { + return r.error(); + } + else + { + return std::forward( f )(); + } +} + // operator&= // result &= unary-returning-value diff --git a/test/result_and_fn1r.cpp b/test/result_and_fn1r.cpp index 249779a..ef4e64a 100644 --- a/test/result_and_fn1r.cpp +++ b/test/result_and_fn1r.cpp @@ -85,6 +85,21 @@ result fri3( int& ) return {}; } +result fk() +{ + return 7; +} + +result fk2() +{ + return E2(); +} + +result fk3() +{ + return {}; +} + int main() { { @@ -343,5 +358,111 @@ int main() BOOST_TEST( r2.has_error() ); } + { + result r; + + { + result r2 = r & fk; + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + } + + { + result r2 = r & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk3; + BOOST_TEST( r2.has_value() ); + } + } + + { + result const r; + + { + result r2 = r & fk; + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + } + + { + result r2 = r & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk3; + BOOST_TEST( r2.has_value() ); + } + } + + { + result r2 = result() & fk; + BOOST_TEST( r2.has_value() ) && BOOST_TEST_EQ( *r2, 7 ); + } + + { + result r2 = result() & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result() & fk3; + BOOST_TEST( r2.has_value() ); + } + + { + result r( in_place_error ); + + { + result r2 = r & fk; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk3; + BOOST_TEST( r2.has_error() ); + } + } + + { + result const r( in_place_error ); + + { + result r2 = r & fk; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = r & fk3; + BOOST_TEST( r2.has_error() ); + } + } + + { + result r2 = result( in_place_error ) & fk; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result( in_place_error ) & fk2; + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result( in_place_error ) & fk3; + BOOST_TEST( r2.has_error() ); + } + return boost::report_errors(); }