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
Lepaskan: 2024-12-30 08:55:09
asal
345 orang telah melayarinya

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;
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan