Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Semak jika Kelas C Mempunyai Fungsi Ahli dengan Tandatangan Tertentu?

Bagaimanakah Saya Boleh Semak jika Kelas C Mempunyai Fungsi Ahli dengan Tandatangan Tertentu?

DDD
DDDasal
2024-12-30 08:55:09350semak imbas

How Can I Check if a C   Class Has a Member Function with a Specific Signature?

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:

  • semak: Percubaan untuk memanggil kaedah yang ditentukan pada objek tiruan dan menyemak jenis pemulangan terhadap jenis yang dijangkakan.
  • jenis: Menentukan sama ada jenis pemulangan fungsi semak sepadan dengan jenis yang dijangkakan.

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&amp;) { return 42; } 
};

struct Y : X {};

std::cout << has_serialize<X, int(const std::string&amp;)>::value << endl; // 1 (true)
std::cout << has_serialize<Y, int(const std::string&amp;)>::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!

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