Maison > développement back-end > C++ > Comment puis-je détecter la présence de variables membres spécifiques dans les classes C ?

Comment puis-je détecter la présence de variables membres spécifiques dans les classes C ?

Linda Hamilton
Libérer: 2024-12-14 18:52:16
original
655 Les gens l'ont consulté

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

Détection des variables membres dans les classes C

Dans le développement de code, il est souvent nécessaire de déterminer la présence de variables membres spécifiques au sein d'une classe. Ces informations sont particulièrement utiles pour créer des fonctions de modèle d'algorithme générique qui opèrent sur diverses classes avec différents noms de membres.

Énoncé du problème

Étant donné une classe comme argument de modèle, l'objectif est de déterminer si elle possède une variable membre particulière, désignée par « x » ou « X » (ou leurs homologues majuscules). Cette capacité faciliterait la création d'algorithmes génériques qui gèrent différents systèmes de coordonnées, tels que les classes CPoint de MFC ou PointF de GDI.

Solution

Pour résoudre ce problème, un modèle peut être implémenté qui accepte une classe comme argument de modèle et vérifie la présence de la variable membre souhaitée. En tirant parti de l'opérateur sizeof et des traits de type, il est possible de faire la différence entre l'existence de variables membres « x » et « X ».

Voici un exemple d'implémentation :

template<int> struct TT { typedef int type; };
template<class P> bool Check_x(P p, typename TT<sizeof(&P::x)>::type b = 0) { return true; }
template<class P> bool Check_x(P p, typename TT<sizeof(&P::X)>::type b = 0) { return false; }
Copier après la connexion

Ce modèle fonctionne en comparant la taille de &P::x et &P::X pour déterminer quelle variable membre est présente. Si &P::x existe, le modèle renvoie true ; sinon, il renvoie false.

Solution universelle

La solution proposée est compatible à la fois avec Visual Studio et GNU C . Cependant, pour une approche plus universelle, une solution utilisant les traits de type C 11 peut être utilisée :

#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

Cette solution utilise les traits de type decltype et std::false_type pour détecter la présence de x dans la classe donnée. . Si T a une variable membre x, HasX sera évalué à vrai ; sinon, il sera évalué à faux.

Exemple d'utilisation

Pour démontrer l'utilisation du modèle HasX :

struct A { int x; };
struct B { int y; };

int main() {
    std::cout << std::boolalpha << HasX<A>::value << std::endl; // true
    std::cout << std::boolalpha << HasX<B>::value << std::endl; // false
    return 0;
}
Copier après la connexion

Ce code s'imprimera vrai pour HasX et faux pour HasX, indiquant correctement la présence de x dans A et son absence dans B.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal