Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Metaprogramming Dapat Mengesan Kehadiran Pembolehubah Ahli dalam Kelas C?
Mengesan Pembolehubah Ahli Menggunakan Metaprogramming
Soalan:
Bagaimana kita boleh menentukan sama ada kelas mengandungi pembolehubah ahli tertentu, walaupun apabila namanya tidak diketahui atau ia menggunakan nama yang berbeza dalam yang berbeza kelas?
Penyelesaian:
Satu pendekatan melibatkan teknik pengaturcaraan meta dan memanfaatkan pengendali decltype dan SFINAE (Kegagalan Penggantian Bukan Ralat). Pertimbangkan kod berikut:
#include <type_traits> template <typename T, typename = int> struct HasX : std::false_type { }; template <typename T> struct HasX<T, decltype((void) T::x, 0)> : std::true_type { };
Penjelasan:
Penggunaan:
Untuk menggunakan teknik ini, isytiharkan templat seperti berikut:
template <typename T> bool Check_x(T p, typename HasX<T>::type b = 0) { return true; }
Semakan ini akan mengembalikan benar untuk kelas dengan pembolehubah ahli x, seperti:
struct P1 { int x; };
dan palsu bagi mereka yang tiada, seperti:
struct P2 { float X; };
Nota:
Penyelesaian ini mengelak daripada menggunakan ciri C 11, seperti std::is_member_function_pointer, untuk mengekalkan keserasian dengan yang lebih lama penyusun.
Atas ialah kandungan terperinci Bagaimanakah Metaprogramming Dapat Mengesan Kehadiran Pembolehubah Ahli dalam Kelas C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!