Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE?
SFINAE untuk Mengesan Fungsi Ahli Diwarisi
Fungsi ahli yang wujud boleh dikesan menggunakan teknik Kegagalan Gantian Bukan Ralat (SFINAE). Walau bagaimanapun, pelaksanaan SFINAE standard mungkin gagal. Artikel ini meneroka penyelesaian penyelesaian untuk mengesan fungsi ahli yang diwarisi.
Pertimbangkan kod berikut:
<code class="cpp">#include <iostream> template<typename T, typename Sig> struct has_foo { template <typename U, U> struct type_check; template <typename V> static char (& chk(type_check<Sig, &V::foo>*))[1]; template <typename > static char (& chk(...))[2]; static bool const value = (sizeof(chk<T>(0)) == 1); }; struct A { void foo(); }; struct B : A {}; int main() { using namespace std; cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; // false }</code>
Kod ini menggunakan SFINAE untuk mengesan fungsi ahli. Walau bagaimanapun, ia gagal mengesan fungsi ahli yang diwarisi dalam B.
Untuk menangani perkara ini, pangkalan kod berikut boleh digunakan:
<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>
Versi ini menggunakan warisan kelas dan mentakrifkan kelas pembantu untuk membantu dalam semakan SFINAE. Output hasil menunjukkan kejayaan pengesanan fungsi ahli yang diwarisi.
Atas ialah kandungan terperinci Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!