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