Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE dalam C?
SFINAE (Kegagalan Penggantian Bukan Ralat) ialah teknik berkuasa dalam C yang membolehkan penilaian masa penyusunan ungkapan . Ia boleh digunakan untuk mengesan kehadiran fungsi ahli, termasuk yang diwarisi.
Kod berikut menunjukkan satu pendekatan untuk menguji fungsi ahli yang diwarisi:
<code class="cpp">#include <iostream> template<typename Type> class has_foo { class yes { char m; }; class no { yes m[2]; }; struct BaseMixin { void foo() {} }; struct Base : public Type, public BaseMixin {}; template<typename T, T t> class Helper {}; template<typename U> static no deduce(U*, Helper<void(BaseMixin::*)(), &U::foo>* = 0); static yes deduce(...); public: static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0))); }; struct A { void foo(); }; struct B : A {}; struct C {}; int main() { using namespace std; cout << boolalpha << has_foo<A>::result << endl; cout << boolalpha << has_foo<B>::result << endl; cout << boolalpha << has_foo<C>::result; }</code>
Output:
true true false
Pendekatan ini menggunakan derivasi kelas dan pengaturcaraan meta templat untuk menentukan sama ada jenis tertentu mewarisi kaedah. Kelas BaseMixin mentakrifkan kaedah yang diingini, dan kelas Base berfungsi sebagai jenis perantaraan yang diperoleh daripada kedua-dua jenis sasaran dan BaseMixin. Ini membolehkan penggunaan SFINAE untuk menyimpulkan sama ada kaedah itu wujud pada jenis sasaran.
Kelas has_foo kemudian menggunakan potongan ini untuk menyediakan pemalar masa kompilasi yang menunjukkan sama ada kaedah itu ada. Ini membolehkan kod yang cekap dan boleh diperluaskan yang boleh melaraskan gelagatnya secara dinamik berdasarkan kehadiran atau ketiadaan fungsi ahli yang diwarisi.
Atas ialah kandungan terperinci Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!