Implementation of C 14 make_integer_sequence and Error Analysis
Introduction
The C 14 alias template make_integer_sequence simplifies the creation of the class template integer_sequence. This article discusses an implementation using helper structures and macros and explores an error encountered during compilation.
Implementation of make_integer_sequence
To implement make_integer_sequence, a helper structure make_helper is defined:
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; };
The actual implementation of make_integer_sequence then becomes:
template< class T , class N > using make_integer_sequence = typename make_helper<T,N>::type;
Error Analysis
Compilation with GCC 4.8.0 initially failed due to virtual memory exhaustion. This error occurred when the macro GEN was modified to generate larger sequences. The reason for this is that the implementation requires deep template instantiation, which can exhaust the available memory.
Decreasing Template Depth Instantiation
To decrease deep template instantiation, either the -ftemplate-depth compiler option can be used to increase the maximum depth or a different implementation with logarithmic complexity can be used.
Log N Implementation
The provided log N implementation uses a recursive approach and is more efficient:
template<unsigned...> struct seq{ using type = seq; }; template<class S1, class S2> struct concat; template<unsigned... I1, unsigned... I2> struct concat<seq<I1...>, seq<I2...>> : seq<I1..., (sizeof...(I1)+I2)...>{}; template<class S1, class S2> using Concat = Invoke<concat<S1, S2>>; template<unsigned N> struct gen_seq; template<unsigned N> using GenSeq = Invoke<gen_seq<N>>; template<unsigned N> struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{}; template<> struct gen_seq<0> : seq<>{}; template<> struct gen_seq<1> : seq<0>{};
The above is the detailed content of How to Efficiently Implement C 14's `make_integer_sequence` and Avoid Compilation Errors?. For more information, please follow other related articles on the PHP Chinese website!