Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Ciri Jenis C 11 Boleh Mengesan Kehadiran Fungsi Ahli dengan Tandatangan Khusus?

Bagaimanakah Ciri Jenis C 11 Boleh Mengesan Kehadiran Fungsi Ahli dengan Tandatangan Khusus?

Mary-Kate Olsen
Lepaskan: 2024-12-26 22:59:10
asal
1025 orang telah melayarinya

How Can C  11 Type Traits Detect the Presence of a Member Function with a Specific Signature?

Mengesan Kehadiran Fungsi Ahli Menggunakan Ciri Jenis C 11

Soalan:

Bagaimana kita boleh tentukan sama ada kelas mempunyai fungsi ahli dengan tandatangan tertentu tanpa memerlukan kelas untuk menyediakan ia?

Penghuraian Dilema:

Masalah timbul apabila kita perlu melakukan operasi tersuai berdasarkan kehadiran atau ketiadaan fungsi ahli tertentu dalam kelas. Tidak seperti kes di mana kelas mesti menyediakan fungsi, kami mencari kaedah untuk membezakan kewujudannya untuk pemprosesan bersyarat. Penyelesaian yang ideal mengelakkan penindasan fungsi global, seruan tindanan yang berlebihan dan pengisytiharan ruang nama yang mengganggu.

Penyelesaian Berasaskan Templat:

Menggunakan ciri jenis C 11, kita boleh mencipta fungsi templat yang mengesahkan kewujudan sasaran fungsi:

template<typename C, typename Ret, typename... Args>
struct has_serialize {
    // Assertion to prevent instantiation with non-function arguments
    static_assert(
        std::integral_constant<T, false>::value,
        "Second template parameter needs to be of function type."
    );

    // Specialization to perform the check
    private:
        template<typename T>
        static constexpr auto check(T*)
        -> typename
            std::is_same<
                decltype( std::declval<T>().serialize( std::declval<Args>()... ) ),
                Ret    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            >::type;  // attempt to call it and see if the return type is correct

        template<typename>
        static constexpr std::false_type check(...);

        typedef decltype(check<C>(0)) type;

    public:
        static constexpr bool value = type::value;
};
Salin selepas log masuk

Penggunaan:

Kami kini boleh menggunakan templat has_serialize untuk mengesahkan kewujudan fungsi dalam kelas:

struct X {
    int serialize(const std::string&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value; // prints 1
Salin selepas log masuk

Dalam contoh di atas, has_serialize::value will juga menilai kepada benar kerana warisan mengekalkan tandatangan fungsi. Ciri ini merupakan kelebihan utama berbanding penyelesaian yang dibentangkan dalam urutan asal.

Atas ialah kandungan terperinci Bagaimanakah Ciri Jenis C 11 Boleh Mengesan Kehadiran Fungsi Ahli dengan Tandatangan Khusus?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan