diff --git a/include/continuable/continuable-traverse.hpp b/include/continuable/continuable-traverse.hpp index f1aafaf..7e146f1 100644 --- a/include/continuable/continuable-traverse.hpp +++ b/include/continuable/continuable-traverse.hpp @@ -71,7 +71,10 @@ namespace cti { /// /// \since 3.0.0 template -decltype(auto) map_pack(Mapper&& mapper, T&&... pack) { +auto map_pack(Mapper&& mapper, T&&... pack) + -> decltype(detail::traversal::transform( + detail::traversal::strategy_remap_tag{}, std::forward(mapper), + std::forward(pack)...)) { return detail::traversal::transform(detail::traversal::strategy_remap_tag{}, std::forward(mapper), std::forward(pack)...); @@ -83,7 +86,7 @@ decltype(auto) map_pack(Mapper&& mapper, T&&... pack) { /// /// \since 3.0.0 template -constexpr decltype(auto) spread_this(T&&... args) noexcept( +constexpr auto spread_this(T&&... args) noexcept( noexcept(std::make_tuple(std::forward(args)...))) { using type = detail::traversal::spreading::spread_box...>; return type(std::make_tuple(std::forward(args)...)); diff --git a/include/continuable/detail/traverse.hpp b/include/continuable/detail/traverse.hpp index ec88031..10e43a8 100644 --- a/include/continuable/detail/traverse.hpp +++ b/include/continuable/detail/traverse.hpp @@ -797,7 +797,10 @@ public: /// \copybrief try_traverse template - decltype(auto) init_traverse(strategy_remap_tag, T&& element) { + auto init_traverse(strategy_remap_tag, T&& element) + -> decltype(spreading::unpack_or_void( + std::declval().try_traverse(strategy_remap_tag{}, + std::declval()))) { return spreading::unpack_or_void( try_traverse(strategy_remap_tag{}, std::forward(element))); } @@ -809,8 +812,15 @@ public: /// Calls the traversal method for every element in the pack, /// and returns a tuple containing the remapped content. template - decltype(auto) init_traverse(strategy_remap_tag strategy, First&& first, - Second&& second, T&&... rest) { + auto init_traverse(strategy_remap_tag strategy, First&& first, + Second&& second, T&&... rest) + -> decltype(spreading::tupelize_or_void( + std::declval().try_traverse( + strategy, std::forward(first)), + std::declval().try_traverse( + strategy, std::forward(second)), + std::declval().try_traverse( + strategy, std::forward(rest))...)) { return spreading::tupelize_or_void( try_traverse(strategy, std::forward(first)), try_traverse(strategy, std::forward(second)), @@ -832,7 +842,9 @@ public: /// Traverses the given pack with the given mapper and strategy template -decltype(auto) transform(Strategy strategy, Mapper&& mapper, T&&... pack) { +auto transform(Strategy strategy, Mapper&& mapper, T&&... pack) -> decltype( + std::declval::type>>() + .init_traverse(strategy, std::forward(pack)...)) { mapping_helper::type> helper( std::forward(mapper)); return helper.init_traverse(strategy, std::forward(pack)...);