Heim > Backend-Entwicklung > C++ > Hauptteil

Wie initialisiere ich „std::array' elegant für nicht standardmäßige konstruierbare Typen?

Patricia Arquette
Freigeben: 2024-10-30 09:53:27
Original
597 Leute haben es durchsucht

How to Initialize `std::array` for Non-Default Constructible Types Elegantly?

Elegante Initialisierung von std::array für nicht standardmäßige konstruierbare Typen

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

Der genseq_t Der Typ stellt eine Folge von Zahlen von 0 bis N-1 dar, und die Wiederholungsfunktion nimmt einen Wert und eine Folge an und gibt ein mit diesem Wert gefülltes Array zurück.

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

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

Die benutzerdefinierte Sequenz- und Wiederholungsfunktion bietet eine flexible und elegante Lösung zum Initialisieren von std::array mit nicht standardmäßigen konstruierbaren Typen.

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!

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