Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Meniru Permulaan Tatasusunan Gaya C dengan `std::array` dalam C ?

Bagaimanakah Saya Boleh Meniru Permulaan Tatasusunan Gaya C dengan `std::array` dalam C ?

Barbara Streisand
Barbara Streisandasal
2024-12-17 20:23:14602semak imbas

How Can I Mimic C-Style Array Initialization with `std::array` in C  ?

Meniru C Array Initialization dengan std::array

Dalam pengaturcaraan C, pengaturcaraan tatasusunan boleh dipermudahkan menggunakan sintaks int arr[] = { e1, e2, e3 , ... }, di mana bilangan elemen disimpulkan secara automatik. Walaupun std::array menyediakan alternatif moden kepada tatasusunan C, ia tidak mempunyai kaedah permulaan yang mudah ini. Artikel ini meneroka teknik untuk meniru tingkah laku ini dengan std::array.

Satu pendekatan melibatkan fungsi templat variadik:

template<class T, class... Tail>
auto make_array(T head, Tail... tail) -> std::array<T, 1 + sizeof...(Tail)>
{
    std::array<T, 1 + sizeof...(Tail)> a = { head, tail ... };
    return a;
}

Fungsi ini mengambil kepala elemen awal dan sebarang bilangan elemen tambahan sebagai ekor. Ia mencipta std::array saiz yang sesuai, memulakannya dengan elemen yang disediakan. Sebagai contoh, kod auto a = make_array(1, 2, 3); memulakan std::array yang mengandungi elemen 1, 2 dan 3.

Walau bagaimanapun, pendekatan ini menghadapi pengehadan. Ia bergantung pada keupayaan pengkompil untuk mengoptimumkan salinan nilai yang dikembalikan, yang mungkin tidak selalu boleh dipercayai. Selain itu, ia tidak boleh memulakan jenis bersarang, ciri yang disokong oleh pemulaan tatasusunan C. Untuk mengatasi had ini, pertimbangkan penambahbaikan berikut:

  • Gunakan makro untuk memudahkan sintaks:
#define ARRAY(...) make_array(__VA_ARGS__)
  • Benarkan permulaan jenis bersarang dengan mengubah suai tandatangan fungsi:
template<class T, class... Tail>
auto make_array(std::array<T, Size> head, Tail... tail) -> std::array<T, Size + sizeof...(Tail)>
{
    std::array<T, Size + sizeof...(Tail)> a = { head, tail ... };
    return a;
}

Menggunakan penambahbaikan ini, pemula jenis bersarang menjadi mungkin, seperti yang dilihat dalam contoh:

#define ARRAY(...) make_array(__VA_ARGS__)

struct A { int a; int b; };
auto arr = ARRAY(A{1, 2}, A{3, 4});

Teknik ini menyediakan penyelesaian yang mantap untuk mencontohi pemulaan tatasusunan C dengan std::array, membolehkan pemulaan mudah dan ringkas bagi objek std::array dalam kod C moden .

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Meniru Permulaan Tatasusunan Gaya C dengan `std::array` dalam C ?. 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