Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Metaprogramming Dapat Mengesan Kehadiran Pembolehubah Ahli dalam Kelas C?

Bagaimanakah Metaprogramming Dapat Mengesan Kehadiran Pembolehubah Ahli dalam Kelas C?

DDD
DDDasal
2024-12-11 18:10:14132semak imbas

How Can Metaprogramming Detect the Presence of Member Variables in C   Classes?

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:

  1. Templat utama HasX mengisytiharkan bahawa secara lalai, kelas tidak mempunyai pembolehubah ahli bernama x .
  2. Pengkhususan untuk U = int mengatasi pengisytiharan lalai ini menggunakan SFINAE. Apabila jenis T digantikan, ia cuba menilai (kosong) T::x. Jika T mempunyai pembolehubah ahli bernama x, ungkapan ini akan berjaya dan HasX terbit daripada std::true_type, menunjukkan bahawa x wujud.
  3. Ungkapan decltype((void) T::x, 0) menipu pengkompil untuk menganggap T::x sebagai ungkapan jenis int. Ini memastikan SFINAE berlaku seperti yang dijangkakan.

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!

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