Implementierung von C 14 make_integer_sequence und Fehleranalyse
Einführung
Die C 14-Alias-Vorlage make_integer_sequence vereinfacht die Erstellung der Klassenvorlage integer_sequence. In diesem Artikel wird eine Implementierung unter Verwendung von Hilfsstrukturen und Makros erläutert und ein Fehler untersucht, der während der Kompilierung aufgetreten ist.
Implementierung von make_integer_sequence
Um make_integer_sequence zu implementieren, wird eine Hilfsstruktur make_helper definiert:
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; };
Die tatsächliche Umsetzung von make_integer_sequence wird dann zu:
template< class T , class N > using make_integer_sequence = typename make_helper<T,N>::type;
Fehleranalyse
Die Kompilierung mit GCC 4.8.0 schlug zunächst aufgrund der Erschöpfung des virtuellen Speichers fehl. Dieser Fehler trat auf, als das Makro GEN geändert wurde, um größere Sequenzen zu generieren. Der Grund dafür ist, dass die Implementierung eine tiefe Vorlageninstanziierung erfordert, wodurch der verfügbare Speicher erschöpft werden kann.
Verringerung der Vorlagentiefe-Instanziierung
Um die tiefe Vorlageninstanziierung zu verringern, entweder die Die Compileroption -ftemplate- Depth kann verwendet werden, um die maximale Tiefe zu erhöhen, oder es kann eine andere Implementierung mit logarithmischer Komplexität erfolgen verwendet.
Log-N-Implementierung
Die bereitgestellte Log-N-Implementierung verwendet einen rekursiven Ansatz und ist effizienter:
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>{};
Das obige ist der detaillierte Inhalt vonWie kann man „make_integer_sequence' von C 14 effizient implementieren und Kompilierungsfehler vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!