Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memulakan `std::array` dengan Elegan dengan Jenis Tidak Boleh Dibina?

Bagaimana untuk Memulakan `std::array` dengan Elegan dengan Jenis Tidak Boleh Dibina?

Barbara Streisand
Barbara Streisandasal
2024-10-29 04:42:29857semak imbas

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

Permulaan Elegan bagi std::array dengan Jenis Tidak Boleh Bina Lalai

Memulakan std::array dengan bukan lalai- jenis elemen yang boleh dibina boleh menjadi tugas yang menyusahkan. Mengulang nilai n kali secara manual adalah tidak cekap dan mudah ralat untuk n besar.

Untuk menangani isu ini, pendekatan yang lebih elegan melibatkan penggunaan jenis jujukan dan penjana. Idea utama ialah mencipta jujukan indeks daripada 0 hingga n-1 dan kemudian menggunakan fungsi untuk menggunakan nilai berulang kali pada setiap indeks.

Berikut ialah pelaksanaan:

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

Kepada mulakan std::array menggunakan pendekatan ini:

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

Selain itu, takrifan berikut digunakan:

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

Penyelesaian ini menyediakan cara yang cekap dan elegan untuk memulakan std::array dengan jenis tidak boleh bina lalai, tanpa mengira nilai n.

Atas ialah kandungan terperinci Bagaimana untuk Memulakan `std::array` dengan Elegan dengan Jenis Tidak Boleh Dibina?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn