„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie initialisiere ich ein „std::array“ elegant mit nicht standardmäßig konstruierbaren Typen?

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

Veröffentlicht am 24.11.2024
Durchsuche:315

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

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

Initialisierung eines std::array mit einem nicht standardmäßigen Typ 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 beheben, 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:

template
auto repeat(T value, seq) -> std::array
{
  // Unpack N, repeating `value` sizeof...(N) times
  // Note that (X, value) evaluates to value
  return {(N, value)...};
}

So initialisieren Sie ein std::array mit diesem Ansatz:

template
void f(T value)
{
  // genseq_t is seq
  std::array items = repeat(value, genseq_t{});
}

Zusätzlich werden folgende Definitionen verwendet:

template
struct seq
{
  using type = seq;

  static const std::size_t size = sizeof ... (N);

  template
  struct push_back : seq {};
};

template
struct genseq : genseq::type::template push_back {};

template
struct genseq : seq {};

template
using genseq_t = typename genseq::type;

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

Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3