Bagaimana untuk Memulakan `std::array` dengan Elegan dengan Jenis Boleh Bina Bukan Lalai dalam C ?

Susan Sarandon
Lepaskan: 2024-10-27 20:17:01
asal
933 orang telah melayarinya

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

Permulaan Elegan std::array dengan Jenis Boleh Bina Bukan Lalai

Dalam alam C , std::array menawarkan cara yang mudah untuk mengendalikan tatasusunan saiz tetap. Walau bagaimanapun, memulakan elemen dalam tatasusunan menimbulkan cabaran apabila berurusan dengan jenis yang tidak mempunyai pembina lalai.

Pertimbangkan coretan kod berikut:

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

Walaupun mudah, mengulang nilai secara manual menjadi membosankan kerana N bertambah. Untuk menangani isu ini, pendekatan yang lebih elegan ialah memanfaatkan pengikatan berstruktur dan templat variadik C 17.

Menggunakan Penjana Jujukan dan Fungsi Ulangan

Kunci kepada elegan ini penyelesaian terletak pada penjanaan urutan jenis seq<0,1,2,3,...N-1> menggunakan genseq_t<> penjana. Dengan jenis jujukan ini, kita boleh mentakrifkan fungsi ulangan yang mengambil nilai dan jujukan yang dijana sebagai parameter dan mengembalikan std::array diisi dengan nilai berulang.

Contoh Pelaksanaan

<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>
Salin selepas log masuk

Butiran Corak

  • genseq_t< ;N>::type mewakili jenis urutan yang menjangkau dari 0 hingga N-1.
  • ulang(nilai, seq) menilai kepada satu std::array dengan setiap elemen yang dimulakan kepada nilai.

Teknik ini membolehkan permulaan yang ringkas dan elegan bagi std::array walaupun apabila T tidak mempunyai pembina lalai.

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!