Menyemak Kewujudan Fungsi Ahli dengan Tanda Tangan Tersuai
Dalam artikel ini, kami menangani cabaran untuk menentukan sama ada kelas C mempunyai fungsi ahli tertentu dengan tandatangan tertentu. Tidak seperti isu yang dibincangkan dalam buku Scott Meyers, matlamat di sini adalah untuk membezakan antara kelas yang memiliki dan tidak mempunyai fungsi.
Tipu Templat
Untuk mencapai matlamat ini, kami memperkenalkan helah templat yang memanfaatkan ciri C 11. Struktur templat has_serialize berfungsi sebagai templat utama dan menegaskan bahawa parameter templat kedua mestilah jenis fungsi.
Pengkhususan untuk Pengesahan Fungsi
Pengkhususan templat has_serialize mengendalikan pengesahan fungsi sebenar. Ia menggunakan dua fungsi templat:
Fungsi Pengesahan
Untuk menguji kewujudan fungsi tertentu f(Args...) dengan tandatangan Ret(Args...) dalam kelas C:
std::cout << has_serialize<C, Ret(Args...)>::value << endl;
Contoh Penggunaan
Dalam contoh berikut, kami mentakrifkan dua kelas, X dan Y, di mana Y mewarisi daripada X. Kelas X mempunyai fungsi ahli bersiri(const std::string&) yang mengembalikan int.
Menggunakan templat has_serialize, kami boleh mengesahkan bahawa kedua-dua X dan Y memiliki fungsi bersiri dengan betul tandatangan:
struct X { int serialize(const std::string&) { return 42; } }; struct Y : X {}; std::cout << has_serialize<X, int(const std::string&)>::value << endl; // 1 (true) std::cout << has_serialize<Y, int(const std::string&)>::value << endl; // 1 (true)
Ini menunjukkan bagaimana helah templat has_serialize boleh mengesan dengan berkesan sama ada kelas mengandungi fungsi ahli tertentu bagi sesuatu tandatangan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Semak jika Kelas C Mempunyai Fungsi Ahli dengan Tandatangan Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!