Memahami Ungkapan SFINAE
Dalam konteks pengaturcaraan C, Ungkapan SFINAE (Kegagalan Penggantian Bukan Ralat) membolehkan anda menggunakan fungsi secara bersyarat lebihan beban berdasarkan kesahihan ungkapan dalam fungsi pengisytiharan.
Ekspresi SFINAE dalam Tindakan
Pertimbangkan contoh kod berikut:
Contoh 1:
template <int I> struct A {}; char xxx(int); char xxx(float); template <class T> A<sizeof(xxx((T)0))> f(T) {}
Fungsi f() mengembalikan struct A dengan parameter yang saya tetapkan kepada saiz hasil memanggil xxx() dengan nilai tuangan parameter templat T kepada (T)0.
Contoh 2:
struct X {}; struct Y { Y(X) {} }; template <class T> auto f(T t1, T t2) -> decltype(t1 + t2); // #1 X f(Y, Y); // #2 X x1, x2; X x3 = f(x1, x2); // deduction fails on #1 (cannot add X+X), calls #2
Dalam contoh 2, f () lebihan fungsi membenarkan penambahan jenis berangka (#1) dan pembinaan Y daripada X (#2). Apabila fungsi f() dipanggil dengan x1 dan x2 (iaitu objek X), lebihan beban yang membina Y dipilih kerana lebihan beban pertama adalah tidak sah untuk objek X.
Kes Penggunaan Biasa: Trait Definisi
Ungkapan SFINAE biasanya digunakan dalam definisi sifat, di mana ia membolehkan anda mentakrifkan ciri berdasarkan kewujudan fungsi ahli tertentu dalam kelas. Contohnya:
struct has_member_begin_test { template <class U> static auto test(U* p) -> decltype(p->begin(), std::true_type()); template <class> static auto test(...) -> std::false_type; }; template <class T> struct has_member_begin : decltype(has_member_begin_test::test<T>(0)) {};
Templat struct has_member_begin boleh digunakan untuk menyemak sama ada kelas mempunyai fungsi ahli begin(). Ia menggunakan Ungkapan SFINAE untuk menentukan sama ada ungkapan begin() mengembalikan jenis atau ungkapan yang sah dan mengembalikan std::true_type jika sah, sebaliknya std::false_type.
Nota Penting:
Ekspresi SFINAE ialah penambahan yang agak baru kepada bahasa C dan tidak semua penyusun menyokongnya sepenuhnya. Jika anda menghadapi sebarang masalah dengan Expression SFINAE dalam kod anda, adalah penting untuk mengesahkan bahawa versi pengkompil anda menyokongnya.
Atas ialah kandungan terperinci Bagaimanakah Ungkapan SFINAE (Kegagalan Penggantian Bukan Satu Ralat) berfungsi dalam C dan bagaimanakah ia boleh digunakan untuk mentakrifkan ciri dan menggunakan lebihan fungsi secara bersyarat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!