From 5cb2aaa34e3a8cff699c34ab8a4a0d1c87b7cf98 Mon Sep 17 00:00:00 2001 From: Simon Brand Date: Fri, 24 Aug 2018 10:27:10 +0100 Subject: [PATCH] Fix for MSVC --- tl/expected.hpp | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tl/expected.hpp b/tl/expected.hpp index 15b8d08..71a59d9 100644 --- a/tl/expected.hpp +++ b/tl/expected.hpp @@ -1985,6 +1985,7 @@ auto expected_map_impl(Exp &&exp, F &&f) { } #else template >::value> * = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), detail::enable_if_t::value> * = nullptr> @@ -1999,6 +2000,7 @@ constexpr auto expected_map_impl(Exp &&exp, F &&f) } template >::value> * = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), detail::enable_if_t::value> * = nullptr> @@ -2011,6 +2013,33 @@ auto expected_map_impl(Exp &&exp, F &&f) -> expected> { return unexpected>(std::forward(exp).error()); } + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> + +constexpr auto expected_map_impl(Exp &&exp, F &&f) + -> ret_t> { + using result = ret_t>; + + return exp.has_value() ? result(detail::invoke(std::forward(f))) + : result(unexpect, std::forward(exp).error()); +} + +template >::value> * = nullptr, + class Ret = decltype(detail::invoke(std::declval())), + detail::enable_if_t::value> * = nullptr> + +auto expected_map_impl(Exp &&exp, F &&f) -> expected> { + if (exp.has_value()) { + detail::invoke(std::forward(f)); + return {}; + } + + return unexpected>(std::forward(exp).error()); +} #endif #if defined(TL_EXPECTED_CXX14) && !defined(TL_EXPECTED_GCC49) && \