Heim > Backend-Entwicklung > C++ > Hauptteil

Wie initialisiere ich ein „std::array' elegant mit nicht standardmäßig konstruierbaren Typen?

Barbara Streisand
Freigeben: 2024-10-29 04:42:29
Original
790 Leute haben es durchsucht

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

Elegante Initialisierung von std::array mit einem nicht standardmäßig konstruierbaren Typ

Initialisierung eines std::array mit einem nicht standardmäßigen- Die Auswahl eines konstruierbaren Elementtyps kann eine mühsame Aufgabe sein. Das manuelle Wiederholen des Werts n-mal ist bei großen n ineffizient und fehleranfällig.

Um dieses Problem zu lösen, besteht ein eleganterer Ansatz darin, einen Sequenztyp und einen Generator zu verwenden. Die Schlüsselidee besteht darin, eine Folge von Indizes von 0 bis n-1 zu erstellen und dann eine Funktion zu verwenden, um wiederholt einen Wert auf jeden Index anzuwenden.

Hier ist eine Implementierung:

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

Zu Initialisieren Sie ein std::array mit diesem Ansatz:

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

Zusätzlich werden die folgenden Definitionen verwendet:

<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> {};
};

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

Diese Lösung bietet eine effiziente und elegante Möglichkeit, std::array zu initialisieren mit nicht standardmäßig konstruierbaren Typen, unabhängig vom Wert von n.

Das obige ist der detaillierte Inhalt vonWie initialisiere ich ein „std::array' elegant mit nicht standardmäßig konstruierbaren 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!