Реализация 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, и привел к ошибке:
виртуальная память исчерпана.
Итак, мой вопрос, как мне уменьшить глубину создания шаблона?
С уважением, Хуршид.