SFINAE: Membuka Kunci Pengaturcaraan Templat Lanjutan
Kegagalan penggantian bukan ralat (SFINAE) ialah teknik yang berkuasa dalam pengaturcaraan meta templat C yang membenarkan templat fungsi dan kelas untuk berkelakuan berbeza berdasarkan jenis hujah templatnya. Walaupun memahami konsepnya adalah penting, contoh praktikal boleh mengukuhkan utilitinya.
Pemeriksaan Boolean Serbaguna
Aplikasi SFINAE yang biasa dan mudah ialah semakan keadaan boolean. Pertimbangkan contoh berikut:
<code class="cpp">template<int I> void div(char(*)[I % 2 == 0] = 0) { /* taken when I is even */ } template<int I> void div(char(*)[I % 2 == 1] = 0) { /* taken when I is odd */ }</code>
Dalam kod ini, fungsi templat div mempunyai dua pengkhususan. Mana satu yang dipilih bergantung pada sama ada ungkapan I % 2 == 0 atau I % 2 == 1 menghasilkan jenis tatasusunan yang sah. Jika ungkapan itu benar, badan fungsi yang sepadan dengan ungkapan sebenar dipilih. Pendekatan elegan ini membolehkan semakan boolean yang ringkas dan selamat jenis.
Memastikan Had Pengumpulan
Satu lagi kegunaan berharga SFINAE ialah menguatkuasakan had pada senarai pemula. Pertimbangkan kelas templat berikut:
<code class="cpp">template<int N> struct Vector { template<int M> Vector(MyInitList<M> const& i, char(*)[M <= N] = 0) { /* ... */ } };</code>
Kelas ini hanya menerima senarai pemula dengan saiz maksimum N. Penggunaan char(*)[0] sebagai hujah templat terakhir mengeksploitasi SFINAE: apabila M melebihi N , ungkapan M <= N menjadi palsu, menyebabkan jenis tatasusunan tidak sah char(*)[0]. Oleh itu, pengkhususan templat untuk saiz senarai tidak sah diabaikan, memastikan kontrak kelas dipenuhi.
Pemilihan Jenis Bergantung Keadaan
Ringkasnya, SFINAE membenarkan pengaturcara untuk semak keadaan dan pilih laluan kod yang sesuai pada masa penyusunan. Ia adalah alat berkuasa yang membolehkan penciptaan templat canggih dengan keupayaan lanjutan, menjadikannya penting untuk pengaturcaraan meta templat lanjutan.
Atas ialah kandungan terperinci Bagaimanakah SFINAE Mendayakan Semakan Keadaan Masa Kompilasi dalam Templat C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!