#include <vector>
#include <array>
#include <numeric>
#include <iostream>

template<int ... I>
struct IndexSeq
{
};

template<int T, typename T> struct MakeIndexSeqImpl;
template<int T, int ... H>
struct MakeIndexSeqImpl<T, IndexSeq<H ...>>
{
	typedef IndexSeq<H..., T> type;
};

template<int N, int Init, int Step>
struct MakeIndexSeq
{
	typedef typename MakeIndexSeqImpl<(N - 1) * Step + Init, typename MakeIndexSeq<N - 1, Init, Step>::type>::type type;
};

template<int Init, int Step>
struct MakeIndexSeq<1, Init, Step>
{
	typedef IndexSeq<Init> type;
};

template<int ... I>
constexpr std::array<int, sizeof ... (I)> MakeSeqImpl(IndexSeq<I ...> seq)
{
	return std::array<int, sizeof ... (I)>{I ...};
}

template<int I, int Step = 1, int Init = 0>
constexpr std::array<int, I> MakeSeq()
{
	return MakeSeqImpl(typename MakeIndexSeq<I, Init, Step>::type());
}

int main()
{
   for (auto i : MakeSeq<20, 10, 10>())
   {
      std::cout << i << ' ';
   }
}