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

Linda Hamilton
Lepaskan: 2024-10-28 04:59:01
asal
762 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!

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!