diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index cdfe85b..3aa565e 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1029,6 +1029,23 @@ template()() ), + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type +> + U operator|( result&& r, F&& f ) +{ + if( r ) + { + return {}; + } + else + { + return std::forward( f )(); + } +} + } // namespace system } // namespace boost diff --git a/test/result_or_fn0r.cpp b/test/result_or_fn0r.cpp index 2ca5a21..18ed7cd 100644 --- a/test/result_or_fn0r.cpp +++ b/test/result_or_fn0r.cpp @@ -335,5 +335,25 @@ int main() BOOST_TEST( r2.has_error() ); } + { + result r2 = result() | fv; + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result() | fv2; + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result( in_place_error ) | fv; + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result( in_place_error ) | fv2; + BOOST_TEST( r2.has_error() ); + } + return boost::report_errors(); }