Heim  >  Artikel  >  Backend-Entwicklung  >  Wie initialisiere ich „std::array“ elegant mit nicht standardmäßigen konstruierbaren Typen in C?

Wie initialisiere ich „std::array“ elegant mit nicht standardmäßigen konstruierbaren Typen in C?

Susan Sarandon
Susan SarandonOriginal
2024-10-27 20:17:01934Durchsuche

 How to Elegantly Initialize `std::array` with Non-Default Constructible Types in C  ?

Elegante Initialisierung von std::array mit nicht standardmäßigen konstruierbaren Typen

Im Bereich von C std::array bietet eine praktische Möglichkeit, Arrays mit fester Größe zu verwalten. Das Initialisieren von Elementen innerhalb eines Arrays stellt jedoch eine Herausforderung dar, wenn es um Typen geht, denen Standardkonstruktoren fehlen.

Bedenken Sie den folgenden Codeausschnitt:

<code class="cpp">template<typename T, int N>
void f(T value)
{
    std::array<T, N> items = {value, value, value, value, value};
}</code>

Das manuelle Wiederholen des Werts ist zwar einfach, wird aber mühsam N nimmt zu. Um dieses Problem anzugehen, besteht ein eleganterer Ansatz darin, die strukturierten Bindungen und variadischen Vorlagen von C 17 zu nutzen.

Verwendung von Sequenzgeneratoren und der Wiederholungsfunktion

Der Schlüssel zu dieser Eleganz Die Lösung besteht darin, eine Sequenz vom Typ seq<0,1,2,3,...N-1> zu generieren. mit genseq_t<> Generator. Mit diesem Sequenztyp können wir eine Wiederholungsfunktion definieren, die einen Wert und die generierte Sequenz als Parameter akzeptiert und ein std::array zurückgibt. gefüllt mit dem wiederholten Wert.

Beispielimplementierung

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // genseq_t<N> represents seq<0,1,...N-1>
    std::array<T, N> items = repeat(value, genseq_t<N>{});
}</code>

Musterdetails

  • genseq_t< ;N>::type stellt den Sequenztyp dar, der von 0 bis N-1 reicht.
  • repeat(value, seq) wird ausgewertet als ein std::array wobei jedes Element auf einen Wert initialisiert wird.

Diese Technik ermöglicht eine präzise und elegante Initialisierung von std::array auch wenn T keinen Standardkonstruktor hat.

Das obige ist der detaillierte Inhalt vonWie initialisiere ich „std::array“ elegant mit nicht standardmäßigen konstruierbaren Typen in C?. 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