Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE?

Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE?

Patricia Arquette
Patricia Arquetteasal
2024-11-05 13:52:02526semak imbas

How to Detect Inherited Member Functions Using 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 (&amp; chk(type_check<Sig, &amp;V::foo>*))[1];
    template <typename  > static char (&amp; 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::*)(), &amp;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!

Kenyataan:
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