Heim > Backend-Entwicklung > C++ > Wie kann man „make_integer_sequence' von C 14 effizient implementieren und Kompilierungsfehler vermeiden?

Wie kann man „make_integer_sequence' von C 14 effizient implementieren und Kompilierungsfehler vermeiden?

Patricia Arquette
Freigeben: 2024-12-28 02:10:14
Original
596 Leute haben es durchsucht

How to Efficiently Implement C  14's `make_integer_sequence` and Avoid Compilation Errors?

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;
};
Nach dem Login kopieren

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;
Nach dem Login kopieren

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>{};
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage