Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memulakan `std::array` untuk Jenis Boleh Bina Bukan Lalai Secara Elegan?

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

Patricia Arquette
Patricia Arquetteasal
2024-10-30 09:53:27604semak imbas

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>

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>

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>

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!

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