Skip to content

Instantly share code, notes, and snippets.

@xforce
Created August 8, 2014 05:17
Show Gist options
  • Save xforce/7b746a039d5101b0c25a to your computer and use it in GitHub Desktop.
Save xforce/7b746a039d5101b0c25a to your computer and use it in GitHub Desktop.
Reverse tuple
template <typename... Ts>
struct tuple_reverse;
template <>
struct tuple_reverse<std::tuple<>>
{
using type = std::tuple<>;
};
template <typename T, typename... Ts>
struct tuple_reverse<std::tuple<T, Ts...>>
{
using head = std::tuple<T>;
using tail = typename tuple_reverse<std::tuple<Ts...>>::type;
using type = decltype(std::tuple_cat(std::declval<tail>(), std::declval<head>()));
};
template<typename T, size_t... I>
auto
reverse_impl(T&& t, std::index_sequence<I...>)
{
return std::make_tuple(std::get<sizeof...(I) -1 - I>(std::forward<T>(t))...);
}
template<typename T>
auto
reverse(T&& t)
{
typedef typename std::remove_reference<decltype(::std::forward<T>(t))>::type ltype_const;
typedef typename std::remove_const<ltype_const>::type ltype;
return reverse_impl(std::forward<T>(t),
std::make_index_sequence<std::tuple_size<ltype>::value>());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment