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

Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE dalam C?

DDD
DDDasal
2024-11-06 00:36:02469semak imbas

How to Detect Inherited Member Functions Using SFINAE in C  ?

Menggunakan SFINAE untuk Memeriksa Fungsi Ahli Diwarisi

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!

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