#include <array>
#include <type_traits>

template<int ... N>
struct seq
{
   using type = seq<N...>;
   static const std::size_t size = sizeof ... (N);

   template<int I>
   struct push_back : seq<N..., I> {};
};
                
template<int N>
struct genseq : genseq<N-1>::type::template push_back<N-1> {};

template<>
struct genseq<0> : seq<> {};

template<int N>
using genseq_t = typename genseq<N>::type;

template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)> 
{
   //unpack N, repeating `value` sizeof...(N) times
   //note that (X, value) evaluates to value
   return {(N, value)...}; 
}

struct A{
  A(int){}  
};


template<typename T, size_t N>
std::array<T, N> filled_array(T const& u)
{
    //genseq_t<N> is seq<0,1,...N-1>
    std::array<T, N> items = repeat(u, genseq_t<N>{} );
    return items;
}

int main() {
    auto x = filled_array<A, 5>(A(1));
}