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.
É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.
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; }
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.
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 { };
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
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; }
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!