summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMurray Cumming <murrayc@murrayc.com>2016-02-19 12:39:50 +0100
committerMurray Cumming <murrayc@murrayc.com>2016-02-19 12:51:05 +0100
commit2e3f2b1f2a8f06baf33a1a9a7d508d0df31d5c88 (patch)
tree7b65b3a2cced47aa93b4b3960ac77e1da040eda5
parent43780608cb651cd90ff4abc7d6be7df782c74cbb (diff)
downloadsigc++-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.h20
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);
}