summaryrefslogtreecommitdiff
path: root/friendly_fusion.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'friendly_fusion.hpp')
-rw-r--r--friendly_fusion.hpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/friendly_fusion.hpp b/friendly_fusion.hpp
index b014bd8..09ec920 100644
--- a/friendly_fusion.hpp
+++ b/friendly_fusion.hpp
@@ -126,4 +126,40 @@ struct struct_member_name : private traits::is_sequence<T, false>, public boost:
}
+namespace utils {
+
+template<typename T, int I>
+class DecayedTypeOfAtIndex {
+ typedef friendly_fusion::result_of::begin<T> begin;
+ typedef friendly_fusion::result_of::advance_c<typename begin::type, I> adv_it;
+ typedef friendly_fusion::result_of::deref<typename adv_it::type> deref;
+ typedef std::decay<typename deref::type> decayed;
+
+public:
+ typedef typename decayed::type type;
+};
+
+template<typename T, int I>
+class RefTypeOfAtIndex {
+ typedef friendly_fusion::result_of::begin<T> begin;
+ typedef friendly_fusion::result_of::advance_c<typename begin::type, I> adv_it;
+ typedef friendly_fusion::result_of::deref<typename adv_it::type> deref;
+
+public:
+ typedef typename deref::type type;
+};
+
+template<typename T, int I>
+class UnrefTypeOfAtIndex {
+ typedef friendly_fusion::result_of::begin<T> begin;
+ typedef friendly_fusion::result_of::advance_c<typename begin::type, I> adv_it;
+ typedef friendly_fusion::result_of::deref<typename adv_it::type> deref;
+ typedef std::remove_reference<typename deref::type> unrefed;
+
+public:
+ typedef typename unrefed::type type;
+};
+
+}
+
} \ No newline at end of file