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
Lepaskan: 2024-12-11 18:10:14
asal
188 orang telah melayarinya

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

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

Semakan ini akan mengembalikan benar untuk kelas dengan pembolehubah ahli x, seperti:

struct P1 { int x; };
Salin selepas log masuk

dan palsu bagi mereka yang tiada, seperti:

struct P2 { float X; };
Salin selepas log masuk

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!

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