diff options
author | Murray Cumming <murrayc@murrayc.com> | 2016-02-19 12:39:50 +0100 |
---|---|---|
committer | Murray Cumming <murrayc@murrayc.com> | 2016-02-19 12:51:05 +0100 |
commit | 2e3f2b1f2a8f06baf33a1a9a7d508d0df31d5c88 (patch) | |
tree | 7b65b3a2cced47aa93b4b3960ac77e1da040eda5 | |
parent | 43780608cb651cd90ff4abc7d6be7df782c74cbb (diff) | |
download | sigc++-2e3f2b1f2a8f06baf33a1a9a7d508d0df31d5c88.tar.gz |
tuple_transform_each(): Avoid use of std::make_tuple().
To preserve std::ref()ed elements.
test_bind now builds and passes.
-rw-r--r-- | sigc++/tuple_transform_each.h | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/sigc++/tuple_transform_each.h b/sigc++/tuple_transform_each.h index 78da544..9ec9cfb 100644 --- a/sigc++/tuple_transform_each.h +++ b/sigc++/tuple_transform_each.h @@ -93,11 +93,11 @@ struct tuple_transform_each_impl { template <typename T_current, typename T_original> static decltype(auto) tuple_transform_each(T_current&& t, T_original& t_original) { - using element_type = typename std::tuple_element<index, std::decay_t<T_current>>::type; - - auto& from = std::get<index>(t_original); - const auto element = T_transformer<element_type>::transform(from); - const auto t_element = std::make_tuple(element); + using from_element_type = typename std::tuple_element<index, std::decay_t<T_current>>::type; + using to_element_type = typename std::result_of<decltype ( + &T_transformer<from_element_type>::transform)(from_element_type&)>::type; + const auto t_element = + std::tuple<to_element_type>(T_transformer<from_element_type>::transform(std::get<index>(t_original))); const auto t_start = tuple_start<index>(std::forward<T_current>(t)); @@ -124,10 +124,12 @@ struct tuple_transform_each_impl<T_transformer, 0> { tuple_transform_each(T_current&& t, T_original& t_original) { constexpr std::size_t index = 0; - using element_type = typename std::tuple_element<index, T_original>::type; - const auto element = - T_transformer<element_type>::transform(std::get<index>(t_original)); - const auto tuple_element = std::make_tuple(element); + using from_element_type = typename std::tuple_element<index, T_original>::type; + using to_element_type = typename std::result_of<decltype ( + &T_transformer<from_element_type>::transform)(from_element_type&)>::type; + const auto tuple_element = + std::tuple<to_element_type>(T_transformer<from_element_type>::transform(std::get<index>(t_original))); + const auto tuple_rest = tuple_cdr(std::forward<T_current>(t)); return std::tuple_cat(tuple_element, tuple_rest); } |