Maison > développement back-end > C++ > Comment la métaprogrammation peut-elle détecter la présence de variables membres dans les classes C ?

Comment la métaprogrammation peut-elle détecter la présence de variables membres dans les classes C ?

DDD
Libérer: 2024-12-11 18:10:14
original
121 Les gens l'ont consulté

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

Détection des variables membres à l'aide de la métaprogrammation

Question :

Comment pouvons-nous déterminer si une classe contient une variable membre particulière, même lorsque son nom est inconnu ou qu'elle utilise des noms différents dans différents classes ?

Solution :

Une approche implique des techniques de métaprogrammation et exploite l'opérateur decltype et SFINAE (Substitution Failure Is Not An Error). Considérez le code suivant :

#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 { };
Copier après la connexion

Explication :

  1. Le modèle principal HasX déclare que par défaut, une classe n'a pas de variable membre nommée x .
  2. La spécialisation pour U = int remplace cette déclaration par défaut en utilisant SFINAE. Lorsqu'un type T est substitué, il tente d'évaluer (vide) T::x. Si T a une variable membre nommée x, cette expression réussira et HasX dérive de std::true_type, indiquant que x existe.
  3. L'expression decltype((void) T::x, 0) incite le compilateur à traiter T::x comme une expression de type int. Cela garantit que SFINAE se produit comme prévu.

Utilisation :

Pour utiliser cette technique, déclarez le modèle comme suit :

template <typename T>
bool Check_x(T p, typename HasX<T>::type b = 0) { return true; }
Copier après la connexion

Cette vérification renverrait vrai pour les classes avec une variable membre x, comme :

struct P1 { int x; };
Copier après la connexion

et faux pour celles qui n'en ont pas, comme as :

struct P2 { float X; };
Copier après la connexion

Remarque :

Cette solution évite d'utiliser les fonctionnalités C 11, telles que std::is_member_function_pointer, pour maintenir la compatibilité avec les anciens compilateurs.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal