Bagaimana untuk Mengesan Fungsi Ahli Diwarisi Menggunakan SFINAE dalam C?

DDD
Lepaskan: 2024-11-06 00:36:02
asal
467 orang telah melayarinya

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>
Salin selepas log masuk

Output:

true
true
false
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!