Heim  >  Artikel  >  Backend-Entwicklung  >  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?

Barbara Streisand
Barbara StreisandOriginal
2024-10-29 04:42:29785Durchsuche

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>

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>

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>

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!

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