Vérification de l'existence de variables membres de classe en C
La question cherche un moyen de déterminer la présence de variables membres spécifiques, à savoir "x" ou "X", au sein d'une classe qui sert d'argument de modèle. Cette technique est particulièrement utile lorsque vous travaillez avec des classes comme MFC CPoint ou GDI PointF, dont chacune emploie un membre "x" distinct.
Solutions proposées
La réponse propose deux solutions :
1. Solution basée sur les macros :
Cette approche repose sur l'utilisation des macros du préprocesseur de Visual Studio :
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; }
Cependant, cette solution est limitée à Visual Studio et ne se compile pas en GNU C .
2. Solution basée sur C 11 :
Cette solution exploite les traits de type C 11 :
#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 technique fonctionne en utilisant SFINAE (Substitution Failure Is Not An Error) pour vérifier les membres variables. Si une variable membre existe, la spécialisation de modèle pour le type correspondant sera invoquée, ce qui donnera une vraie valeur de retour. Sinon, le modèle par défaut sera sélectionné, produisant une fausse valeur de retour.
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!