Реализация C ++ 14 make_integer_sequence

Я пытался реализоватьC ++ 14 шаблон псевдонимаmake_integer_sequence, что упрощает создание шаблона класса.integer_sequence

template< class T, T... I> struct integer_sequence
{
    typedef T value_type;
    static constexpr size_t size() noexcept { return sizeof...(I) ; }

};

template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.

Реализоватьmake_integer_sequence нам нужна вспомогательная структура.make_helper

template< class T , class N >
using make_integer_sequence = typename make_helper::type;

Внедрениеmake_helper ISN»Слишком сложно.

template< class T, T N, T... I >
struct make_helper
{
   typedef typename mpl::if_< T(0) == N,  
                  mpl::identity< integer_sequence >,
                  make_helper< T, N-1, N-1,I...> 
               >::type;
};

Тестироватьmake_integer_sequence Я сделал эту основную функцию:

int main()
{
    #define GEN(z,n,temp)   \
     typedef make_integer_sequence< int, n >  BOOST_PP_CAT(int_seq,n) ;

   BOOST_PP_REPEAT(256, GEN, ~);
}

Я скомпилировал программу с GCC 4.8.0 на четырехъядерной системе i5 с 8 ГБ ОЗУ. Успешная компиляция заняла 4 секунды.

Но когда я изменил макрос GEN на:

int main() {

#define GEN(z,n,temp) \
typedef make_integer_sequence< int, n * 4 > BOOST_PP_CAT(int_seq, n) ;

BOOST_PP_REPEAT(256, GEN, ~ );
}

Компиляция не удалась и вывел сообщение об ошибке:

виртуальная память исчерпана.

Может ли кто-нибудь объяснить эту ошибку и чем она вызвана?

РЕДАКТИРОВАТЬ:

Я упростил тест до:

int main()
{
   typedef make_integer_sequence< int, 4096 > int_seq4096;
}

Затем я успешно скомпилировал с GCC 4.8.0 -ftemplate-глубина = 65536.

Однако это второй тест:

int main()
{
    typedef make_integer_sequence< int, 16384 > int_seq16384;
}

Не компилировался с GCC 4.8.0 -ftemplate-deep = 65536, и привел к ошибке:

виртуальная память исчерпана.

Итак, мой вопрос, как мне уменьшить глубину создания шаблона?

С уважением, Хуршид.

Ответы на вопрос(6)

Ваш ответ на вопрос