reverse_tuple
ちょっと書いてみました。
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/tuple.hpp> template<typename Tuple> struct reverse_tuple{ Tuple tuple; }; namespace sprout{ namespace tuples{ template<std::size_t I, typename Tuple> struct tuple_element<I, reverse_tuple<Tuple>> : tuple_element<tuple_size<Tuple>{} - I - 1, Tuple> {}; template<typename Tuple> struct tuple_size<reverse_tuple<Tuple>> : tuple_size<Tuple>{}; template<typename Tuple> struct tuple_size<reverse_tuple<Tuple> const> : tuple_size<Tuple>{}; template<typename Tuple> struct rebind_types<reverse_tuple<Tuple>> : rebind_types<Tuple> {}; template<std::size_t I, typename Tuple> SPROUT_CONSTEXPR auto get(reverse_tuple<Tuple> const& tuple) SPROUT_NOEXCEPT ->decltype(sprout::get<tuple_size<Tuple>::value - I -1>(tuple.tuple)) { return sprout::get<tuple_size<Tuple>{} - I -1>(tuple.tuple); } } // namespace tuples } // namespace sprout template<typename T> constexpr reverse_tuple<typename std::remove_reference<T>::type> reverse(T&& t){ return { std::forward<T>(t) }; } #include <sprout/string.hpp> int main(){ constexpr auto t = reverse(sprout::make_tuple(42, 3.14f, sprout::to_string("homu"))); static_assert(sprout::tuples::get<0>(t) == sprout::to_string("homu"), ""); static_assert(sprout::tuples::get<1>(t) == 3.14f, ""); static_assert(sprout::tuples::get<2>(t) == 42, ""); return 0; }
まぁ tuple_element と get を特殊化して逆にしているだけですねー。
[boost]
- ver 1.48.0