Bagaimana untuk Memulakan `std::array` untuk Jenis Boleh Bina Bukan Lalai Secara Elegan?

Patricia Arquette
Lepaskan: 2024-10-30 09:53:27
asal
521 orang telah melayarinya

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

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

Dalam konteks ini, memulakan std::array boleh menjadi cabaran apabila jenis yang terkandung (T) tidak mempunyai pembina lalai. Penyelesaian biasa melibatkan pengulangan nilai secara manual untuk mengisi tatasusunan, proses yang membosankan dan mudah ralat untuk nilai n yang besar.

Nasib baik, pendekatan yang lebih elegan wujud menggunakan gabungan jenis jujukan dan fungsi ulangan tersuai. Pertimbangkan kod berikut:

<code class="cpp">template<typename T, int N>
void f(T value)
{
    // Generate a sequence of numbers: 0, 1, ..., N-1
    using genseq_t = genseq_t<N>;
    std::array<T, N> items = repeat(value, genseq_t{});
}</code>
Salin selepas log masuk

Genseq_t jenis mewakili jujukan nombor dari 0 hingga N-1, dan fungsi ulangan mengambil nilai dan jujukan, mengembalikan tatasusunan yang diisi dengan nilai tersebut.

Pelaksanaan fungsi ulangan melibatkan membongkar jujukan dan mengulangi nilai untuk setiap elemen menggunakan sintaks ringkas:

<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
    return {(N, value)...};
}</code>
Salin selepas log masuk

Jenis genseq_t ditakrifkan secara rekursif menggunakan operasi push_back untuk mencipta jujukan:

<code class="cpp">template<int N>
struct genseq : genseq<N - 1>::type::template push_back<N - 1> {};</code>
Salin selepas log masuk

Jujukan tersuai dan fungsi ulangan menyediakan fleksibel dan penyelesaian yang elegan untuk memulakan std::array dengan jenis boleh bina bukan lalai.

Atas ialah kandungan terperinci Bagaimana untuk Memulakan `std::array` untuk Jenis Boleh Bina Bukan Lalai Secara Elegan?. 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!