Readd return type deduction

This commit is contained in:
Denis Blank 2018-02-07 01:40:20 +01:00
parent 7db24574ae
commit 0e80147343
2 changed files with 21 additions and 6 deletions

View File

@ -71,7 +71,10 @@ namespace cti {
///
/// \since 3.0.0
template <typename Mapper, typename... T>
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>(mapper),
std::forward<T>(pack)...)) {
return detail::traversal::transform(detail::traversal::strategy_remap_tag{},
std::forward<Mapper>(mapper),
std::forward<T>(pack)...);
@ -83,7 +86,7 @@ decltype(auto) map_pack(Mapper&& mapper, T&&... pack) {
///
/// \since 3.0.0
template <typename... T>
constexpr decltype(auto) spread_this(T&&... args) noexcept(
constexpr auto spread_this(T&&... args) noexcept(
noexcept(std::make_tuple(std::forward<T>(args)...))) {
using type = detail::traversal::spreading::spread_box<std::decay_t<T>...>;
return type(std::make_tuple(std::forward<T>(args)...));

View File

@ -797,7 +797,10 @@ public:
/// \copybrief try_traverse
template <typename T>
decltype(auto) init_traverse(strategy_remap_tag, T&& element) {
auto init_traverse(strategy_remap_tag, T&& element)
-> decltype(spreading::unpack_or_void(
std::declval<mapping_helper>().try_traverse(strategy_remap_tag{},
std::declval<T>()))) {
return spreading::unpack_or_void(
try_traverse(strategy_remap_tag{}, std::forward<T>(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 <typename First, typename Second, typename... T>
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<mapping_helper>().try_traverse(
strategy, std::forward<First>(first)),
std::declval<mapping_helper>().try_traverse(
strategy, std::forward<Second>(second)),
std::declval<mapping_helper>().try_traverse(
strategy, std::forward<T>(rest))...)) {
return spreading::tupelize_or_void(
try_traverse(strategy, std::forward<First>(first)),
try_traverse(strategy, std::forward<Second>(second)),
@ -832,7 +842,9 @@ public:
/// Traverses the given pack with the given mapper and strategy
template <typename Strategy, typename Mapper, typename... T>
decltype(auto) transform(Strategy strategy, Mapper&& mapper, T&&... pack) {
auto transform(Strategy strategy, Mapper&& mapper, T&&... pack) -> decltype(
std::declval<mapping_helper<Strategy, typename std::decay<Mapper>::type>>()
.init_traverse(strategy, std::forward<T>(pack)...)) {
mapping_helper<Strategy, typename std::decay<Mapper>::type> helper(
std::forward<Mapper>(mapper));
return helper.init_traverse(strategy, std::forward<T>(pack)...);