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 { };
Explication :
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; }
Cette vérification renverrait vrai pour les classes avec une variable membre x, comme :
struct P1 { int x; };
et faux pour celles qui n'en ont pas, comme as :
struct P2 { float X; };
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!