Heim  >  Artikel  >  Backend-Entwicklung  >  Wie initialisiere ich „std::array“ elegant für nicht standardmäßige konstruierbare Typen?

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

Patricia Arquette
Patricia ArquetteOriginal
2024-10-30 09:53:27522Durchsuche

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>

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>

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

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