Heim > Backend-Entwicklung > C++ > Hauptteil

Wie initialisiere ich ein nicht standardmäßiges konstruierbares std::array elegant mit Template-Metaprogrammierung?

Linda Hamilton
Freigeben: 2024-10-28 04:59:01
Original
762 Leute haben es durchsucht

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

Nicht standardmäßiges konstruierbares std::array elegant initialisieren

Bei der Arbeit mit nicht standardmäßigen konstruierbaren Typen in C kann die Initialisierung eines std::array besonders schwierig sein wenn die Array-Größe durch einen Vorlagenparameter bestimmt wird.

Um dies zu beheben, führen wir einen ausgefeilten Ansatz ein, der Sequenztyp- und Generatorkonzepte nutzt:

Sequenztyp-Seq

Wir definieren einen Sequenztyp namens seq mithilfe einer Template-Metafunktion, die eine Folge aufeinanderfolgender Ganzzahlen darstellt.

<code class="cpp">template<int ... N>
struct seq
{
   using type = seq<N...>;
   static const std::size_t size = sizeof ... (N);
   template<int I>
   struct push_back : seq<N..., I> {};
};</code>
Nach dem Login kopieren

Generator genseq

Mit dieser Sequenz konstruieren wir einen Generator genseq, der generiert Sequenzen mit zunehmender Länge:

<code class="cpp">template<int N>
struct genseq : genseq<N-1>::type::template push_back<N-1> {};

template<>
struct genseq<0> : seq<> {};

template<int N>
using genseq_t = typename genseq<N>::type;</code>
Nach dem Login kopieren

repeat()-Funktion

Sobald die Sequenz vorhanden ist, definieren wir eine wiederholen()-Funktion, um Arrays zu erstellen, die mit demselben Wert initialisiert werden:

<code class="cpp">template<typename T, int...N>
auto repeat(T value, seq<N...>) -> std::array<T, sizeof...(N)> 
{
   //unpack N, repeating `value` sizeof...(N) times
   //note that (X, value) evaluates to value
   return {(N, value)...}; 
}</code>
Nach dem Login kopieren

Verwendung

Um ein std::array eines nicht standardmäßigen konstruierbaren Typs zu initialisieren, rufen wir einfach repeat() mit dem gewünschten Wert und der von genseq_t:

<code class="cpp">template<typename T, int N>
void f(T value)
{
     //genseq_t<N> is seq<0,1,...N-1>
     std::array<T, N>> items = repeat(value, genseq_t<N>{});
}</code>
Nach dem Login kopieren
Diese Lösung gewährleistet eine elegante und effiziente Initialisierung von std::array und eliminiert effektiv die Notwendigkeit einer umständlichen manuellen Wiederholung, wenn n ein großer Vorlagenparameter ist.

Das obige ist der detaillierte Inhalt vonWie initialisiere ich ein nicht standardmäßiges konstruierbares std::array elegant mit Template-Metaprogrammierung?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!