Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan `make_integer_sequence` C 14 dengan Cekap dan Mengelakkan Ralat Penyusunan?

Bagaimana untuk Melaksanakan `make_integer_sequence` C 14 dengan Cekap dan Mengelakkan Ralat Penyusunan?

Patricia Arquette
Lepaskan: 2024-12-28 02:10:14
asal
592 orang telah melayarinya

How to Efficiently Implement C  14's `make_integer_sequence` and Avoid Compilation Errors?

Pelaksanaan C 14 make_integer_sequence dan Analisis Ralat

Pengenalan

Templat alias C 14 make_integer_sequence memudahkan penciptaan templat kelas integer_sequence. Artikel ini membincangkan pelaksanaan menggunakan struktur pembantu dan makro serta meneroka ralat yang dihadapi semasa penyusunan.

Pelaksanaan make_integer_sequence

Untuk melaksanakan make_integer_sequence, struktur pembantu make_helper ditakrifkan:

template< class T, T N, T... I >
struct make_helper
{
   typedef typename mpl::if_< T(0) == N,  
                  mpl::identity< integer_sequence<T,I...> >,
                  make_helper< T, N-1, N-1,I...> 
               >::type;
};
Salin selepas log masuk

Pelaksanaan sebenar make_integer_sequence kemudiannya menjadi:

template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Salin selepas log masuk

Analisis Ralat

Kompilasi dengan GCC 4.8.0 pada mulanya gagal disebabkan oleh kehabisan memori maya. Ralat ini berlaku apabila GEN makro diubah suai untuk menjana jujukan yang lebih besar. Sebab untuk ini ialah pelaksanaan memerlukan instantiasi templat yang mendalam, yang boleh menghabiskan memori yang tersedia.

Penurunan Instantiasi Kedalaman Templat

Untuk mengurangkan instantiasi templat dalam, sama ada Pilihan pengkompil -ftemplate-depth boleh digunakan untuk meningkatkan kedalaman maksimum atau pelaksanaan yang berbeza dengan kerumitan logaritma boleh digunakan.

Pelaksanaan Log N

Pelaksanaan log N yang disediakan menggunakan pendekatan rekursif dan lebih cekap:

template<unsigned...> struct seq{ using type = seq; };

template<class S1, class S2> struct concat;

template<unsigned... I1, unsigned... I2>
struct concat<seq<I1...>, seq<I2...>>
  : seq<I1..., (sizeof...(I1)+I2)...>{};

template<class S1, class S2>
using Concat = Invoke<concat<S1, S2>>;

template<unsigned N> struct gen_seq;
template<unsigned N> using GenSeq = Invoke<gen_seq<N>>;

template<unsigned N>
struct gen_seq : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{};

template<> struct gen_seq<0> : seq<>{};
template<> struct gen_seq<1> : seq<0>{};
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan `make_integer_sequence` C 14 dengan Cekap dan Mengelakkan Ralat Penyusunan?. 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