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:
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>
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>
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>
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>
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!