Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengesan Kewujudan Pembolehubah Ahli Tertentu dalam Kelas C?

Bagaimanakah Saya Boleh Mengesan Kewujudan Pembolehubah Ahli Tertentu dalam Kelas C?

DDD
DDDasal
2024-12-21 10:13:18586semak imbas

How Can I Reliably Detect the Existence of Specific Member Variables in a C   Class?

Mengesan Kewujudan Pembolehubah Ahli Tertentu dalam Kelas

Dalam kod, menyemak kehadiran pembolehubah ahli tertentu dalam kelas boleh mencabar. Ini boleh menjadi penting apabila melaksanakan algoritma generik atau bekerja dengan kelas dengan nama ahli yang berbeza-beza.

Pernyataan Masalah:

Kod yang disediakan bertujuan untuk menangani isu ini dengan menyemak kewujudan "x" (atau "X") dan "y" (atau "Y") dalam hujah templat kelas. Ini amat berguna dalam kelas seperti CPoint MFC atau PointF GDI, di mana nama pembolehubah ahli berbeza.

Penyelesaian asal menggunakan fungsi templat yang berbeza untuk "x" dan "X." Walau bagaimanapun, ini mengakibatkan isu kompilasi dalam Visual Studio.

Penyelesaian Universal:

Untuk mencapai penyelesaian universal, kami boleh menggunakan SFINAE (Kegagalan Penggantian Bukan Ralat) . Kod yang diubah suai di bawah menunjukkan pendekatan ini:

template <typename T>
struct HasX : std::false_type { };

template <typename T>
struct HasX<T, decltype((void)T::x, 0)> : std::true_type { };

Kod ini mengeksploitasi SFINAE dengan cuba menggantikan "T::x" dalam "decltype(...)." Jika "T::x" sah, pengkhususan untuk HasX akan digunakan, menyebabkan HasX::value menjadi benar; jika tidak, ia akan menjadi palsu.

Penyelesaian ini tidak terhad kepada C 11 dan menyediakan kaedah generik untuk mengesan pembolehubah ahli dalam mana-mana kelas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengesan Kewujudan Pembolehubah Ahli Tertentu dalam Kelas C?. 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