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
Mary-Kate Olsenasal
2024-12-26 22:59:101005semak imbas

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;
};

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

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