
    template<typename, typename>
    struct append_to_type_seq { };

    template<typename T, typename... Ts, template<typename...> class TT>
    struct append_to_type_seq<T, TT<Ts...>>
    {
        using type = TT<Ts..., T>;
    };

    template<typename T, unsigned int N, template<typename...> class TT>
    struct repeat
    {
        using type = typename
            append_to_type_seq<
                T,
                typename repeat<T, N-1, TT>::type
                >::type;
    };

    template<typename T, template<typename...> class TT>
    struct repeat<T, 0, TT>
    {
        using type = TT<>;
    };

    #include <type_traits>
    #include <tuple>

    template<typename... Ts>
    struct X { };

    int main()
    {
        repeat<double, 5, std::tuple>::type t = std::make_tuple(1., 2., 3., 4., 5.);
        static_assert(
            std::is_same<
                decltype(t),
                std::tuple<double, double, double, double, double>
            >::value, "!");

        repeat<double, 3, X>::type y;
        static_assert(std::is_same<decltype(y), X<double, double, double>>::value, "!");
    }
