Memanfaatkan SFINAE untuk Pemeriksaan Bersyarat
SFINAE (kegagalan penggantian bukan ralat) ialah teknik yang berkuasa dalam pengaturcaraan meta templat yang membolehkan penyusunan bersyarat berdasarkan sifat jenis. Satu aplikasi SFINAE yang amat berguna ialah keupayaan untuk menyemak keadaan boolean.
Contoh: Menyemak Kesamaan Menggunakan Dimensi Tatasusunan
Pertimbangkan coretan kod berikut:
<code class="cpp">template<int I> void div(char(*)[I % 2 == 0] = 0) { /* this is taken when I is even */ } template<int I> void div(char(*)[I % 2 == 1] = 0) { /* this is taken when I is odd */ }</code>
Dalam contoh ini, fungsi div membebankan berdasarkan dimensi parameter tatasusunan. Apabila saya genap, lebihan pertama digunakan. Jika tidak, beban berlebihan kedua digunakan. Ini dengan berkesan membolehkan anda menyemak pariti I pada masa penyusunan.
Menyemak Had untuk Senarai Pemula
Satu lagi aplikasi berguna SFINAE ialah menyemak had senarai pemula. Sebagai contoh, struktur Vektor berikut mengehadkan bilangan elemen dalam senarai pemulanya menggunakan SFINAE:
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, char(*)[M <<= N] = 0) { /* ... */ } }</code>
Senarai pemula hanya diterima jika bilangan elemen M kurang daripada atau sama dengan N. Jika M melebihi N, jenis tidak sah char(*)[0] dijana, menyebabkan SFINAE membuang templat.
Sebagai alternatif, anda boleh menyatakan keadaan yang sama menggunakan Boost's enable_if macro:
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, typename enable_if_c<M <<= N>::type* = 0) { /* ... */ } }</code>
Aplikasi Praktikal
Dalam amalan, SFINAE menyediakan cara yang berkesan untuk menyemak keadaan semasa instantiasi templat. Ini membolehkan pembangunan kod fleksibel dan selamat jenis dengan keupayaan bersyarat lanjutan.
Atas ialah kandungan terperinci Bagaimanakah SFINAE Boleh Digunakan untuk Semakan Bersyarat dalam Metaprogramming Templat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!