Я попытался реализовать шаблон псевдонима С++ 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<T,N>::type;
Реализация make_helper
не слишком сложна.
template< class T, T N, T... I >
struct make_helper
{
typedef typename mpl::if_< T(0) == N,
mpl::identity< integer_sequence<T,I...> >,
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, ~ );
}
Компиляция не удалась и вышла сообщение об ошибке:
исчерпана виртуальная память.
Может кто-нибудь объяснить эту ошибку и что вызвало ее?
EDIT:
Я упростил тест, чтобы:
int main()
{
typedef make_integer_sequence< int, 4096 > int_seq4096;
}
Затем я успешно скомпилировал с GCC 4.8.0 -ftemplate-depth = 65536.
Однако это второе испытание:
int main()
{
typedef make_integer_sequence< int, 16384 > int_seq16384;
}
Не компилировался с GCC 4.8.0 -ftemplate-depth = 65536 и приводил к ошибке:
виртуальная память исчерпана.
Итак, мой вопрос заключается в том, как уменьшить шаблонную копию шаблона?
С уважением, Хуршид.