diff --git a/tests/extensions.cpp b/tests/extensions.cpp index 8e1c77f..0d9a85b 100644 --- a/tests/extensions.cpp +++ b/tests/extensions.cpp @@ -572,3 +572,13 @@ TEST_CASE("14", "[issue.14]") { }); } + +TEST_CASE("32", "[issue.32]") { + int i = 0; + tl::expected a; + a.map([&i]{i = 42;}); + REQUIRE(i == 42); + + auto x = a.map([]{return 42;}); + REQUIRE(*x == 42); +} diff --git a/tl/expected.hpp b/tl/expected.hpp index 3417f8c..15b8d08 100644 --- a/tl/expected.hpp +++ b/tl/expected.hpp @@ -1934,6 +1934,7 @@ constexpr auto and_then_impl(Exp &&exp, F &&f) -> Ret { #ifdef TL_EXPECTED_CXX14 template >::value> * = nullptr, class Ret = decltype(detail::invoke(std::declval(), *std::declval())), detail::enable_if_t::value> * = nullptr> @@ -1945,6 +1946,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> @@ -1957,6 +1959,30 @@ auto expected_map_impl(Exp &&exp, F &&f) { return result(unexpect, 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) { + 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) { + using result = expected>; + if (exp.has_value()) { + detail::invoke(std::forward(f)); + return result(); + } + + return result(unexpect, std::forward(exp).error()); +} #else template (),