diff options
Diffstat (limited to 'include/utility.h')
-rw-r--r-- | include/utility.h | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/include/utility.h b/include/utility.h index c910eb2..835fdbd 100644 --- a/include/utility.h +++ b/include/utility.h @@ -293,5 +293,45 @@ template <typename F, typename Set> struct empty_context { }; - } + + } // namespace black_magic + + namespace detail + { + + template <class T, std::size_t N, class... Args> + struct get_index_of_element_from_tuple_by_type_impl + { + static constexpr auto value = N; + }; + + template <class T, std::size_t N, class... Args> + struct get_index_of_element_from_tuple_by_type_impl<T, N, T, Args...> + { + static constexpr auto value = N; + }; + + template <class T, std::size_t N, class U, class... Args> + struct get_index_of_element_from_tuple_by_type_impl<T, N, U, Args...> + { + static constexpr auto value = get_index_of_element_from_tuple_by_type_impl<T, N + 1, Args...>::value; + }; + + } // namespace detail + + namespace utility + { + template <class T, class... Args> + T get_element_by_type(std::tuple<Args...>& t) + { + return std::get<detail::get_index_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t); + } + + template <class T, class... Args> + T* get_element_by_type_ptr(std::tuple<Args...>& t) + { + return &std::get<detail::get_index_of_element_from_tuple_by_type_impl<T, 0, Args...>::value>(t); + } + + } // namespace utility } |