Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah SFINAE Boleh Digunakan untuk Semakan Bersyarat dalam Metaprogramming Templat?

Bagaimanakah SFINAE Boleh Digunakan untuk Semakan Bersyarat dalam Metaprogramming Templat?

Linda Hamilton
Lepaskan: 2024-11-02 07:15:02
asal
923 orang telah melayarinya

How Can SFINAE Be Used for Conditional Checking in Template Metaprogramming?

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

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

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

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!

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