Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Memulakan Non-Default Constructible std::array Secara Elegan dengan Pemrograman Meta Templat?

Bagaimana untuk Memulakan Non-Default Constructible std::array Secara Elegan dengan Pemrograman Meta Templat?

Linda Hamilton
Lepaskan: 2024-10-28 04:59:01
asal
928 orang telah melayarinya

How to Initialize Non-Default Constructible std::array Elegantly with Template Metaprogramming?

Memulakan Non-Default Constructible std::array Elegantly

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:

Seq Jenis Jujukan

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

Genseq penjana

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

Fungsi repeat()

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

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