#include <initializer_list>
#include <iostream>
#include <cstdint>

#if 1 // index_sequence and make_index_sequence
// in C++14, but not in C++11
template <std::size_t...> struct index_sequence {};

namespace detail
{
template <typename, typename> struct concat;

template <std::size_t... Is1, std::size_t... Is2>
struct concat<index_sequence<Is1...>, index_sequence<Is2...>> :
    index_sequence<Is1..., (sizeof...(Is1) + Is2)...>
{
    using type = index_sequence<Is1..., (sizeof...(Is1) + Is2)...>;
};

}

template <std::size_t N>
struct make_index_sequence :
    detail::concat<typename make_index_sequence<N / 2>::type,
    typename make_index_sequence<N - N / 2>::type>::type
{
    using type = typename
        detail::concat<typename make_index_sequence<N / 2>::type,
                       typename make_index_sequence<N - N / 2>::type>::type;
};

template <>
struct make_index_sequence<1u> : index_sequence<0u> {
    using type = index_sequence<0u>;
};

template <>
struct make_index_sequence<0u> : index_sequence<> {
    using type = index_sequence<0u>;
};

#endif

template<int N>
struct NumberGeneration{
  static void out(std::ostream& os)
  {
    out(make_index_sequence<N>(), os);
  }
private:
    template<std::size_t ...Is>
    static void out(index_sequence<Is...>, std::ostream& os)
    {
        std::initializer_list<int>{ ((os << (1 + Is) << std::endl), void(), 0)...};
    }

};

int main(int argc, char**argv)
{
   NumberGeneration<1000>::out(std::cout);
	return 0;
}
