| 534 | template <class TryBlock, class... H> |
| 535 | BOOST_LEAF_ATTRIBUTE_NODISCARD BOOST_LEAF_CONSTEXPR inline |
| 536 | typename std::decay<decltype(std::declval<TryBlock>()())>::type |
| 537 | try_handle_some( TryBlock && try_block, H && ... h ) noexcept |
| 538 | { |
| 539 | static_assert(is_result_type<decltype(std::declval<TryBlock>()())>::value, "The return type of the try_block passed to a try_handle_some function must be registered with leaf::is_result_type"); |
| 540 | context_type_from_handlers<H...> ctx; |
| 541 | auto active_context = activate_context(ctx); |
| 542 | if( auto r = std::forward<TryBlock>(try_block)() ) |
| 543 | return r; |
| 544 | else |
| 545 | { |
| 546 | detail::unload_result(&r); |
| 547 | error_id id(r.error()); |
| 548 | ctx.deactivate(); |
| 549 | using R = typename std::decay<decltype(std::declval<TryBlock>()())>::type; |
| 550 | auto rr = ctx.template handle_error<R>(std::move(id), std::forward<H>(h)..., [&r]()->R { return std::move(r); }); |
| 551 | if( !rr ) |
| 552 | ctx.unload(error_id(rr.error())); |
| 553 | return rr; |
| 554 | } |
| 555 | } |
| 556 | |
| 557 | template <class TryBlock, class... H> |
| 558 | BOOST_LEAF_CONSTEXPR inline |