Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Memulakan Non-Default Constructible std::array Secara Elegan dengan Pemrograman Meta Templat?
Apabila bekerja dengan jenis binaan bukan lalai dalam C , memulakan std::array boleh mencabar, terutamanya apabila saiz tatasusunan ditentukan oleh parameter templat.
Untuk menangani perkara ini, kami memperkenalkan pendekatan canggih yang memanfaatkan konsep jenis jujukan dan penjana:
Kami mentakrifkan jenis jujukan yang dipanggil seq menggunakan metafungsi templat, yang mewakili jujukan integer jujukan.
<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> {}; };</code>
Menggunakan jujukan ini, kami membina genseq penjana yang menjana jujukan panjang yang semakin meningkat:
<code class="cpp">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>
Dengan urutan yang ada, kami mentakrifkan fungsi repeat() untuk mencipta tatasusunan yang dimulakan dengan nilai yang sama:
<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>Penyelesaian ini memastikan pemulaan std::array yang elegan dan cekap, dengan berkesan menghapuskan keperluan untuk pengulangan manual yang menyusahkan apabila n ialah parameter templat yang besar.
Atas ialah kandungan terperinci Bagaimana untuk Memulakan Non-Default Constructible std::array Secara Elegan dengan Pemrograman Meta Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!