Elegante Initialisierung von std::array
In diesem Zusammenhang kann die Initialisierung eines std::array eine Herausforderung sein, wenn dem enthaltenen Typ (T) ein Standardkonstruktor fehlt. Eine gängige Lösung besteht darin, den Wert manuell zu wiederholen, um das Array zu füllen, ein mühsamer und fehleranfälliger Prozess für große n-Werte.
Glücklicherweise gibt es einen eleganteren Ansatz, der eine Kombination aus Sequenztypen und einer benutzerdefinierten Wiederholungsfunktion verwendet. Betrachten Sie den folgenden Code:
<code class="cpp">template<typename T, int N> void f(T value) { // Generate a sequence of numbers: 0, 1, ..., N-1 using genseq_t = genseq_t<N>; std::array<T, N> items = repeat(value, genseq_t{}); }</code>
Der genseq_t
Die Implementierung der Wiederholungsfunktion umfasst das Entpacken der Folge und das Wiederholen des Werts für jedes Element mit einer prägnanten Syntax:
<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 return {(N, value)...}; }</code>
Der Typ genseq_t wird rekursiv mithilfe einer Push_back-Operation definiert, um eine Sequenz zu erstellen:
<code class="cpp">template<int N> struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>
Die benutzerdefinierte Sequenz- und Wiederholungsfunktion bietet eine flexible und elegante Lösung zum Initialisieren von std::array
Das obige ist der detaillierte Inhalt vonWie initialisiere ich „std::array' elegant für nicht standardmäßige konstruierbare Typen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!