Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Ciri Jenis C 11 Boleh Mengesan Kehadiran Fungsi Ahli dengan Tandatangan Khusus?
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&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value; // prints 1
Dalam contoh di atas, has_serialize
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!